Запрос Mongodb нуждается в улучшении - PullRequest
0 голосов
/ 11 декабря 2018

Привет всем,

Я работаю над проектом и использую MongoDB в качестве базы данных.У меня есть 2 коллекции, как указано ниже:

комментарии

[{
    "_id":1,
    "name":"testname1",
    "email":"testmail1",
    "user_id":1
},
{
    "_id":2,
    "name":"testname1",
    "email":"testmail1",
    "user_id":1
},
{
    "_id":3,
    "name":"testname1",
    "email":"testmail1",
    "user_id":2
},
{
    "_id":4,
    "name":"testname1",
    "email":"testmail1",
    "user_id":2
},
{
    "_id":5,
    "name":"testname1",
    "email":"testmail1",
    "user_id":2
}]

и пользователи

[{
    "_id":1,
    "name":"testname1",
    "email":"testmail1",
},
{
    "_id":2,
    "name":"testname1",
    "email":"testmail1",
},
]

Я хочу получить результат в следующем формате:

[{
    "_id":1,
    "name":"testname1",
    "email":"testmail1",
    "comment_ids":[1, 2]
},
{
    "_id":2,
    "name":"testname1",
    "email":"testmail1",
    "comment_ids":[3,4,5]
}]

Тезисы - тестовые коллекции. Я не хочу менять структуру своей коллекции.Кто-нибудь может мне помочь, как я могу достичь желаемого результата.Я попытался следующий запрос:

db.users.aggregate([{
   $lookup:
     {
       from: "comments",
       localField: "_id",
       foreignField: "user_id",
       as: "data"
     }
    }
])

Результат запроса:

{
    "_id" : 1,
    "name" : "testname1",
    "email" : "testmail1",
    "data" : [
        {
            "_id" : 1,
            "msg" : "test",
            "email" : "testmail1",
            "user_id" : 1
        },
        {
            "_id" : 2,
            "msg" : "test",
            "email" : "testmail1",
            "user_id" : 1
        }
    ]
}
{
    "_id" : 2,
    "name" : "testname1",
    "email" : "testmail1",
    "data" : [
        {
            "_id" : 3,
            "msg" : "test",
            "email" : "testmail1",
            "user_id" : 2
        },
        {
            "_id" : 4,
            "msg" : "test",
            "email" : "testmail1",
            "user_id" : 2
        },
        {
            "_id" : 5,
            "msg" : "test",
            "email" : "testmail1",
            "user_id" : 2
        }
    ]
}

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Я думаю, что нет необходимости использовать поиск, так как у вас уже есть адрес электронной почты и имя в вашей коллекции комментариев.Вы можете напрямую использовать group.Это будет намного быстрее по сравнению с lookup.Вот пример

db.getCollection('comments').aggregate([
{
    $group:{
    "_id":"$user_id",
        "name":{$first:"$name"},
        "email":{$first:"$email"},
   comments:{$addToSet:"$_id"}
   }
}
])
0 голосов
/ 11 декабря 2018

Просто используйте .dot обозначение с _id

db.users.aggregate([
  { "$lookup": {
    "from": "comments",
    "localField": "_id",
    "foreignField": "user_id",
    "as": "comment_ids"
  }},
  { "$addFields": { "comment_ids": "$comment_ids._id" }}
])
...