Запрос Mongodb нуждается в улучшении

Всем привет,

Я работаю над проектом и использую 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
        }
    ]
}

Каков результат вашего запроса?

Ashh 11.12.2018 09:38

@AnthonyWinzlet Я обновил вопрос с выводом запроса.

Swati 11.12.2018 09:43
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
1
2
36
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

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

db.getCollection('comments').aggregate([
{
    $group:{
    "_id":"$user_id",
        "name":{$first:"$name"},
        "email":{$first:"$email"},
   comments:{$addToSet:"$_id"}
   }
}
])

Спасибо за ответ. Но это тестовые образцы коллекций, мои настоящие коллекции совершенно разные. Вышеуказанный ответ соответствует всем моим требованиям.

Swati 11.12.2018 10:27

Другие вопросы по теме