MongoDB-通过比较集合与对象数组返回现有字段的数组

我是新来的Mongo,并试图比较一个数组与收集文件和匹配logging的返回列表。

让我解释一下: First Array

我有一个收集(用户)与以下文件:

> db.user.find().pretty() { "_id" : ObjectId("57358220bf3e7d076b6ccdb1"), "name" : "Sunny", "phone" : "9417702107", "email" : "ssdhiman07@gmail.com" } { "_id" : ObjectId("57358242bf3e7d076b6ccdb2"), "name" : "Pal", "phone" : "9015719419", "email" : "ss998@gmail.com" } { "_id" : ObjectId("57358262bf3e7d076b6ccdb3"), "name" : "viveky", "phone" : "8826565107", "email" : "sds998@gmail.com" } 

第二个数组 :我有一个来自Http请求的对象数组是数组的结构。

 { "contacts" : [ { "name" : "Sunny", "phone" : "9417702107" }, { "name" : "Sukhpal", "phone" : "9015719419" }, { "name" : "anurag", "phone" : "9988776655" }, { "name" : "vivek", "phone" : "8826565107" } ] } 

现在我想知道第二个数组中的哪些对象存在于第一个数组中 ,哪些不存在。 比较应该只基于手机 。 结果我想要相同的数组作为第二个数组,但有一个额外的字段是“存在”:“真”或“存在”:“假”。 像这样的东西。

 { "contacts" : [ { "name" : "Sunny", "phone" : "9417702107" "exists" :"true" }, { "name" : "pal", "phone" : "90177668899" "exists" :"false" } ] } 

所以对于这个我曾经尝试过的东西是与mongoos的node.js代码。

 exports.matchcontacts = function(req, res, next) { var response = {}; var conArray = req.body.contacts; var contact_list = []; for(var i=0; i<conArray.length;i++) { var name = conArray[i].name; var phone = conArray[i].phone; Users.findOne({"phone":conArray[i].phone},function(err,data) { if(err) { response = {"error" : true,"message" : "Error fetching data"}; } else if(!data) { contact_list.push({name:name,phone:phone,exists:"false"}); } else { contact_list.push({name:name,phone:phone,exists:"true"}); } }); } response = {"error":false,"contacts":contact_list}; res.json(response); }; 

但总是得到空的结果,如果我试图在callback函数内部得到响应,那么它只返回单个最后的比较值。 问题在于第一种方法是callback函数返回结果很晚,所以结果总是空的。 而在第二个方法循环覆盖的结果,它也没有效率使用内部循环callback将调用no的时间。 所以我解释了整个故事

现在请任何人可以帮助我的代码或build议正确的方式来获得所需的结果,谢谢

没有使用mongodb,但我会使用的想法是先迭代你的联系人,并将电话映射到相应的对象,并将它们标记为不存在:

 var obj = {}; for(var i=0; i<conArray.length;i++){ obj[conArray[i].phone] = conArray[i]; conArray[i].exists = false; } 

然后以某种方式search在你的数据库中有这些电话的用户,就像

 var results = Users.find(records that have phone in Object.keys(obj) array) 

最后,你迭代你的logging,并标记相应的联系人

 for(var i=0;i<results.length;i++){ obj[results[i].phone].exists = true; }