#node.js #mongodb #express #mongodb-query
#node.js #mongodb #экспресс #mongodb-запрос
Вопрос:
У меня есть такой документ в коллекции под названием уведомления
[
{
_id: 4f6a686ad4821115c0b4a721,
title: "title 1"
comments: [
{
comment: 'test 1',
client_id: '1664158590921',
createdAt: 2020-09-22T20:00:00.000Z
},
{
comment: 'test 2',
client_id: '1664158590875',
createdAt: 2020-09-22T20:00:00.000Z
}
]
}
]
У меня есть такой документ в коллекции под названием clients
{
_id: 5f6a651faf591a3c742016dd,
client_id: '1664158590921',
email: 'test1@gmail.com'
}
{
_id: 5f6a651faf591a3c742016dd,
client_id: '1664158590875',
email: 'test2@gmail.com'
}
Я пытаюсь создать запрос mongodb, чтобы получить такой результат:
[
{
_id: 4f6a686ad4821115c0b4a721,
title: "title 1"
comments: [
{
comment: 'test 1',
client_id: {
_id: 5f6a651faf591a3c742016dd,
client_id: '1664158590921',
email: 'test1@gmail.com'
},
createdAt: 2020-09-22T20:00:00.000Z
},
{
comment: 'test 2',
client_id: {
_id: 5f6a651faf591a3c742016dd,
client_id: '1664158590875',
email: 'test2@gmail.com'
},
createdAt: 2020-09-22T20:00:00.000Z
}
]
}
]
Возможно ли это или нет?
Любые советы о том, как приблизиться к подобному результату, подобному этому, очень ценятся, спасибо
Ответ №1:
- Поскольку localField является массивом, сначала вам нужно $unwind его.(требуется для следующего этапа)
- используйте $lookup для сопоставления.
- Сгруппируйте их по _id и очистите вывод.
Решение должно быть примерно таким.
db.notifications.aggregate([
{
"$unwind":"$comments"
},
{
"$lookup":{
"from":"clients",
"localField":"comments.client_id",
"foreignField":"client_id",
"as":"client_id"
}
},
{
"$group":{
"_id":"$_id",
"title":{
"$first":"$title"
},
"comments":{
"$push":{
"comment":"$comments.comment",
"client_id":"$client_id",
"createdAt":"$comments.createdAt"
}
}
}
}
]).pretty()