2016-08-12 80 views
0

想象一下,我们有两个集合:topics之一和posts之一。我们有一个user._idMongoDB:如何从另一个集合中获取按键的所有文档而不去标准化?

topic { 
    _id, // topicID 
    userId 
} 

post { 
    topicId 
} 

user { 
    _id 
} 

如何在MongoDB中得到的所有posts通过特定user没有在post存储userId)?

(post.topicId === topic._id) && (topic.userId === user._id) 
+0

从主题集合中收集数组中的所有主题ID,然后在帖子集合中使用$对查询进行topcId以获取所有帖子。 – user10

+0

@ user10,是的,谢谢!有没有更高效的方法?或者什么是最有效的方法呢? – Nathan

回答

1

您可以使用$lookup运营商做左连接上unsharded topic集合,然后筛选使用$match管道所产生的文件。您可能需要使用主题数组上的运算符仅包含与给定用户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 ] } 
       } 
      } 
     } 
    } 
]) 
+0

谢谢!是的,那是我在找的东西。只有'$ lookup'添加数组时,它应该是匹配中的“topics.0.userId”:user._id'。 – Nathan

相关问题