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 ] }
                }
            }
        }
    }
])
Другие вопросы по тегам