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

Просто используйте нотацию .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"}
}
}
])Спасибо за ответ. Но это тестовые образцы коллекций, мои настоящие коллекции совершенно разные. Вышеуказанный ответ соответствует всем моим требованиям.
Каков результат вашего запроса?