2014-06-25 68 views
0

的字段值存在我有一個收集用戶如下:查找該數組中的元素不會在MongoDB中

{ "_id" : ObjectId("51780f796ec4051a536015cf"), "userId" : "John" } 
{ "_id" : ObjectId("51780f796ec4051a536015d0"), "userId" : "Sam" } 
{ "_id" : ObjectId("51780f796ec4051a536015d1"), "userId" : "John1" } 
{ "_id" : ObjectId("51780f796ec4051a536015d2"), "userId" : "john2" } 

現在我想寫一個代碼,可以提供用戶標識的建議在用戶提供的用戶id已經存在於數據庫中。在相同的例行我只是追加從值1至5到例如萬一用戶選擇用戶id是約翰,建議用戶名陣列需要被檢查標識數據庫看起來像這樣

[John,John1,John2,John3,John4,John5]. 

現在我只是想對Db執行它並找出哪些建議值不存在於DB中。因此,我不想選擇任何文檔,而是選擇建議數組中不存在用於用戶收藏的值。

任何指針,非常感謝。

回答

0

這裏您的一般方法是您想要查找集合中已存在的「userId's」的「distinct」值。然後,將這些與您的輸入選擇進行比較以查看差異。

var test = ["John","John1","John2","John3","John4","John5"]; 

var res = db.collection.aggregate([ 
    { "$match": { "userId": { "$in": test } }}, 
    { "$group": { "_id": "$userId" }} 
]).toArray(); 

res.map(function(x){ return x._id }); 

test.filter(function(x){ return res.indexOf(x) == -1 }) 

這樣做的最終結果是用戶標識的不在初始輸入相匹配:

[ "John2", "John3", "John4", "John5" ] 

主要操作者有$in這需要一個數組作爲參數並將這些值針對比較指定的字段。該.aggregate()方法是最好的方法,存在其中直接產生只是值的陣列中,在移除調用等.map()的功能,以汽提出對於一個給定密鑰的值.distinct()方法的速記MapReduce的包裝:

var res = db.collection.distinct("userId",{ "userId": { "$in": test } }) 

它應該運行速度明顯較慢,特別是在大型集合上。

另外別忘了索引你的「用戶id」,並有可能你希望這是「獨一無二」反正所以你真的只是想$match.find()結果:

var res = db.collection.find({ "$in": test }).toArray()