MongoDB:如何通过其他集合中的密钥获取所有文档而不进行反规范化?

时间:2016-08-12 10:38:47

标签: mongodb denormalization

想象一下,我们有两个集合:一个topics和一个posts。我们有user._id

topic  {
    _id, // topicID
    userId
}

post {
    topicId
}

user {
    _id
}

MongoDB如何通过特定posts获取所有user而不在[{1}} 中存储userId)?

post

1 个答案:

答案 0 :(得分:1)

您可以使用 $lookup 运算符在未加密的topic集合上进行左连接,然后使用 $match过滤生成的文档管道。您可能需要使用topics数组上的 $filter 运算符,以仅包含与给定用户ID条件匹配的子文档。以下演示了这种方法:

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 ] }
                }
            }
        }
    }
])