Как получить значение счетчика, используя $ lookup в mongodb, используя golang? - PullRequest
0 голосов
/ 25 апреля 2018

Используя агрегацию, я объединяю две коллекции mongodb, используя golang. Результат выглядит примерно так: -

ВЫВОД: -

{
"response": {
    "code": 1,
    "api_status": 1,
    "message": "Success",
    "total_record": [
        {
            "_id": 1,
            "author_name": "mohit",
            "category": 232,
            "content": "This is the content",
            "date_time": 1524632713,
            "excerpt": "This is a  short text",
            "image": "pic.jpg",
            "resultField": [
                {
                    "_id": 6,
                    "comment": "this is a least comment",
                    "comment_on": 1524644601,
                    "email": "puneet@bookingkoala.com",
                    "name": "puneet",
                    "post_id": 1,
                    "reply_to": 1524644601,
                    "status": 1
                },
                {
                    "_id": 7,
                    "comment": "this is a least comment",
                    "comment_on": 1524647808,
                    "email": "puneet@bookingkoala.com",
                    "name": "puneet",
                    "post_id": 1,
                    "reply_to": 1524647808,
                    "status": 1
                }
            ],
            "status": 0,
            "tags": "this",
            "title": "how to do the code"
        },
        {
            "_id": 2,
            "author_name": "mohit",
            "category": 232,
            "content": "This is the content",
            "date_time": 1524632713,
            "excerpt": "This is a  short text",
            "image": "pic.jpg",
            "resultField": [
                {
                    "_id": 8,
                    "comment": "this is a least comment",
                    "comment_on": 1524648059,
                    "email": "puneet@bookingkoala.com",
                    "name": "puneet",
                    "post_id": 2,
                    "reply_to": 1524648059,
                    "status": 1
                }
            ],
            "status": 0,
            "tags": "this",
            "title": "how to do the code"
        },
        {
            "_id": 3,
            "author_name": "puneet",
            "category": 2,
            "content": "this is content",
            "date_time": 1524641086,
            "excerpt": "this is excerpt",
            "image": "pic.jpg",
            "resultField": [],
            "status": 1,
            "tags": "go",
            "title": "how to do the code"
        }
    ]
 }
}

Этот вывод взят по следующему коду golang: -

mongoSession := config.ConnectDb()
collection := mongoSession.DB(config.Database).C(config.BlogCollection)
pipeline := []bson.M{
    bson.M{"$match": bson.M{}},
    bson.M{"$lookup": bson.M{"from" : "comment", "localField" : "_id", "foreignField": "post_id","as": "resultField" }},
}
fmt.Println(pipeline)
pipe := collection.Pipe(pipeline)
resp := []bson.M{}
err = pipe.All(&resp)
if err != nil {
    fmt.Println("Errored: %#v \n", err)
}
fmt.Println(resp)
if err != nil {
    response = ResponseControllerList{
        config.FailureCode,
        config.FailureFlag,
        config.FailureMsg,
        nil,
        nil,
    }
} else {
    response = ResponseControllerList{
        config.SuccessFlag,
        config.SuccessFlag,
        config.SuccessMsg,
        nil,
        resp,
    }
}

Проблема: - Мне нужно только count из data , а не из data. Имеется в выводе, как показано выше, resultField, в котором отображаются данные, но мне нужно только значение count, например: - "resultField":[2], но оно показывает данные. Как я могу получить количество значений данных в выводе. Заранее спасибо.

1 Ответ

0 голосов
/ 25 апреля 2018

Таким образом, ваша агрегация фактически возвращает все comment документы в поле resultField, которое неявно содержит количество результатов, это фрагмент, который вы можете проверить в Go с помощью встроенной функции len().

Поскольку вам нужна только длина (количество comment документов), поэтому вы хотите получить только размер этого массива.Для этой цели вы можете использовать стадию $addFields для замены массива resultField числом, равным длине этого массива.

pipe := c.Pipe([]bson.M{
    {
        "$lookup": bson.M{
            "from":         "comment",
            "localField":   "_id",
            "foreignField": "post_id",
            "as":           "resultField",
        },
    },
    {
        "$addFields": bson.M{
            "resultField": bson.M{"$size": "$resultField"},
        },
    },
})

Обратите внимание, что стадия $addFieldsэквивалентно этапу $project, который явно указывает все существующие поля во входных документах и ​​добавляет новые поля.Доступно только с версии 3.4 MongoDB.

...