2017-03-19 99 views
0

所以在我的MongoDB數據庫中我有一個集合保存用戶職位。最有效的方法來檢查是否存在一個集合

在該集合中,我有一個名爲「likes」的集合,它包含已經喜歡該帖子的用戶的id數組。查詢時,我想將用戶ID傳遞給我的查詢,並在結果中包含布爾值,告訴我數組中是否存在該ID,以查看用戶是否已經喜歡該帖子。我知道這對於兩個查詢很容易,一個是獲取帖子,另一個是查看用戶是否喜歡它,但我想找到最有效的方法來做到這一點。

例如,我的文檔的一個看起來像這樣

{ 
    _id: 24jef247jos991, 
    post: "Test Post", 
    likes: ["userid1", "userid2"] 
} 

當我從「userid1」查詢我想返回

{ 
    _id: 24jef247jos991, 
    post: "Test Post", 
    likes: ["userid1", "userid2"], 
    userLiked: true 
} 

但是,當我查詢從讓我們說「userid3」我想

{ 
    _id: 24jef247jos991, 
    post: "Test Post", 
    likes: ["userid1", "userid2"], 
    userLiked: false 
} 
+0

可能重複[檢查值是否存在於mongo集合](http://stackoverflow.com/questions/21366814/check-if-value-exist-in-mongo-collection) – Veeram

+0

不是重複的,該問題詢問有些不同。我知道如何不將重複項添加到集合以及如何使用addToSet來執行該操作。這更多的是一個問題,如何將兩個查詢的結果合併爲一個。 – Duxducis

+0

你看過接受答案底部的編輯嗎? – Veeram

回答

2

您可以添加$addFields階段檢查每個文件針對輸入用戶的數組likes

db.collection.aggregate([ 
     { 
      $addFields: { 
       "userLiked":{ $in: [ "userid1", "$likes" ] } 
      } 
     } 
]) 
+0

這似乎是我所需要的,謝謝 – Duxducis

+0

其實我不得不使用$ in操作符而不是$ eq出於某種原因,但總體思路是有效的。 – Duxducis

+0

這的確是對的。更新了答案。 $ eq聚合運算符與$ eq查詢運算符有點不同。項目/ addFields階段中的$ in操作員支持最近才從3.3.5版本添加。感謝您的驗證。這裏是相關的票https://jira.mongodb.org/browse/SERVER-6146 – Veeram

1

從MongoDB 3.4開始,您可以使用$in聚合運算符來檢查數組是否包含給定元素。您可以使用$addFields運算符聚合運算符將新計算的值添加到文檔中,而不必顯式包含其他字段。

db.collection.aggregate([ 
    { "$addFields": { "userLiked": { "$in": [ "userid1", "$likes" ] } } } 
]) 

在MongoDB中3.2,你可以使用$setIsSubset運算符和方括號[]運營商做到這一點。這種方法的缺點是您需要手動輸入文檔中的所有字段。另外$setIsSubset運算符與de-duplicate你的數組可能不是你想要的。

db.collection.aggregate([ 
    { "$project": { 
     "post": 1, "likes": 1, 
     "userLiked": { "$setIsSubset": [ [ "userid3" ], "$likes" ] } 
    }} 
]) 

最後,如果你mongod版本是3.0或以上,你需要使用的,而不是[]運營商$literal操作。

+0

謝謝,我的生產數據庫實際上是mongo 3。2,我最後解決了這個問題,通過過濾數組,然後得到它的大小,並檢查大小是否大於1,但這可能更有效 – Duxducis

+0

還要注意,您接受的答案是錯誤的,因爲'$應該是輸入值。我不知道你是如何使用新計算的字段,但可以將'$ filter'與'$ redact'結合使用,但請記住'$ redact'可以執行collscan – styvane

+0

@ M.StyvaneSoukossi感謝您對我的評論回答。修正表達式的順序。 – Veeram

相關問題