2014-06-25 33 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()