2011-05-06 49 views
0

我是mongodb的新手。mongodb中存儲數組和新數組之間的區別

我已存儲在MongoDB中

{ "_id" : ObjectId("4"), "uid" : "1", "friendsIds" : [ "2", "3" ] } 

案例1以下數據: 現在,我有了新的一套friendsIds ["2","3","4"]

我想比較兩個集合,並得到的沒有存儲在數據庫中的值。在這種情況下,我想4

案例2: 現在,我有了新的一套friendsIds ["3","4"]

我想比較兩個集合,並獲得存儲在數據庫中的價值但不在新的集合中。在這種情況下,我想獲得2

案例2可以使用mapReduce?

如何在mongodb中實現這兩種情況?

回答

0

,如果你有兩個數組

a = [ "2", "3" ] 
b = ["2","3","4"] 

在紅寶石:

a-b = ["4"] 
+0

我想用MongoDB的查詢做到這一點。在這種情況下,我希望在db中執行它的速度應該比在代碼中快得多。 – venkat 2011-05-06 00:51:03

+0

開發人員經常犯的最大錯誤之一是試圖將處理卸載到數據庫 - 讓應用程序服務器處理它並讓數據庫服務器處理插入和查詢。在您的應用程序代碼中進行比較。 – 2011-05-06 01:35:09

+0

@bryan爲什麼你說它是「最大的錯誤」?卸載處理db的所有缺點是什麼? DB應該爲連接操作進行優化嗎? [IMO,案例2可以作爲連接操作解決] – venkat 2011-05-06 02:19:58

1

爲1的情況下,它看起來像你需要[$addToSet][1]。看看$each的例子。

對於情況2,沒有這樣的服務器端功能。只需帶回文檔並比較客戶端。

你在做什麼行動,你只是想要2而不是其他所有的東西?

0

這可以在聚合框架使用來實現其set operators

> db.foo.insert({"friendsIds" : [ "2", "3"]}) 
WriteResult({ "nInserted" : 1 }) 

> db.foo.aggregate([ {$project: {diff: {$setDifference: [["2","3","4"], '$friendsIds']}}} ]) 
{ "_id" : ObjectId("53490a53a0e3abbe0dd0c21c"), "diff" : [ "4" ] } 

> db.foo.aggregate([ {$project: {diff: {$setDifference: ['$friendsIds', ["3","4"]]}}} ]) 
{ "_id" : ObjectId("53490a53a0e3abbe0dd0c21c"), "diff" : [ "2" ] } 
相關問題