MongoDB: Как получить все документы по ключам из других коллекций без денормализации?
Представьте, что у нас есть две коллекции: одна из topics
и один из posts
, И у нас есть user._id
:
topic {
_id, // topicID
userId
}
post {
topicId
}
user {
_id
}
Как в MongoDB получить все posts
по конкретным user
(без хранения userId
в post
)?
(post.topicId === topic._id) && (topic.userId === user._id)
1 ответ
Решение
Вы могли бы использовать $lookup
Оператор, чтобы сделать левое соединение на неотмеченных topic
коллекции, затем отфильтруйте полученные документы, используя $match
трубопровод. Возможно, вам придется использовать $filter
оператор в массиве themes, чтобы включить только вложенные документы, которые соответствуют заданному условию идентификатора пользователя. Следующее демонстрирует этот подход:
db.post.aggregate([
{
"$lookup": {
"from": "topic",
"localField": "topicId",
"foreignField": "_id",
"as": "topics"
}
},
{ "$match": { "topics.userId": user._id } },
{
"$project": {
"topics": {
"$filter": {
"input": "$topics",
"as": "item",
"cond": { "$eq": [ "$$item.userId", user._id ] }
}
}
}
}
])