У меня есть встроенный документ постов и комментариев. Где комментарии - это встроенный документ с данными пользователя commentedby
. Существует большая вероятность того, что имя пользователя часто меняется. Таким образом, значение пользователя необходимо искать при каждом обращении к комментарию.
Есть ли эффективный способ сделать это с помощью запроса монго. Я не предпочитаю использовать размотку Так как при повторной группировке я потеряю другие параметры сообщения
{
"PostId":"Post001",
"Comments":[
{"_id": "001",
"CommentedBy":{
"_id":"User001",
"Name":"UserName001",
"email":"user001@eg.com"
}
},
{"_id": "002",
"CommentedBy":{
"_id":"User002",
"Name":"UserName002",
"email":"user001@eg.com"
}
},
{"_id": "003",
"CommentedBy":{
"_id":"User003",
"Name":"UserName003",
"email":"user001@eg.com"
}
}
]
}
Пользовательский документ состоит не только из имени пользователя и идентификатора. Использование нескольких поисков может закончиться ссылкой User001
Несколько раз.
Ожидаемый результат
{
"PostId":"Post001",
"Comments":[
{"_id": "001",
"CommentedBy":{
"_id":"User001",
"Name":"UserName001",
"email":"user001@eg.com",
"Group":"Marketing",
"Location":"India" }
},
{"_id": "002",
"CommentedBy":{
"_id":"User002",
"Name":"UserName002",
"email":"user002@eg.com",
"Group":"Engineering",
"Location":"USA"
}
},
{"_id": "003",
"CommentedBy":{
"_id":"User002",
"Name":"UserName002",
"email":"user002@eg.com",
"Group":"Engineering",
"Location":"USA"
}
}
]
}
Пользовательский документ будет выглядеть примерно так
User = [
{
"_id":"User001",
"Name":"UserName001",
"email":"user001@eg.com",
"Group":"Marketing",
"Location":"USA"
},
{
"_id":"User002",
"Name":"UserName002",
"email":"user002@eg.com",
"Group":"Engineering",
"Location":"USA"
}
...
...
]
запрос, который я пытался
db.getCollection('Posts').aggregate([
{$lookup:{
from: "User",
localField: "Comments.CommentedBy._id",
foreignField: "_id",
as: "Comments.CommentedBy"
}},
])
- Будет ли это эффективно для n-записей с n-комментариями
- Будет ли монго выполнять какую-то оптимизацию при поиске
User002
, поскольку его нужно искать дважды.
- Если CommentedBy - это список пользователей, как сделать $ lookup в этом случае