2016-08-12 49 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

相關問題