2016-05-13 48 views
1

我是新来的Mongo,并试图比较一个数组与收集文件并返回匹配记录列表。MongoDB-通过比较集合与对象数组的比较集合返回Array的现有字段

让我解释一下:第一个数组

我有一个集合(用户)提供以下文件:

> db.user.find().pretty() 
{ 
    "_id" : ObjectId("57358220bf3e7d076b6ccdb1"), 
    "name" : "Sunny", 
    "phone" : "9417702107", 
    "email" : "[email protected]" 
} 
{ 
    "_id" : ObjectId("57358242bf3e7d076b6ccdb2"), 
    "name" : "Pal", 
    "phone" : "9015719419", 
    "email" : "[email protected]" 
} 
{ 
    "_id" : ObjectId("57358262bf3e7d076b6ccdb3"), 
    "name" : "viveky", 
    "phone" : "8826565107", 
    "email" : "[email protected]" 
} 

第二个数组:我有对象的数组,它是来自的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); 
}; 

但总是得到空{}空的结果,如果我试图让回调函数内响应,那么它仅返回单个去年相比价值。 问题第一个方法是回调函数返回结果很晚所以结果总是空的。 和第二种方法循环覆盖结果,它也没有效率使用循环内部的回调它将调用no的时间。所以整个故事,我曾解释

现在请任何人可以帮助我的代码或建议权的方式来获得期望的结果得益于

+0

从来没有使用MongoDB的,但不容您在您的数据库中的所有这些手机的手机的数组,搜索(Users.find我相信)并一次处理所有内容?这样你只需要管理一个回调 – juvian

+0

@juvian我很欣赏你的建议,并且我已经在**运算符中使用了** $,但它返回了所有匹配结果(整个文档数据)。但是怎样才能知道哪些记录没有找到,并准备有**存在**的字段。和一个更多的东西(用户集合)“名称”谷和**第二阵列**“名称”字段值可以不同。所以我想要名称值相同**第二阵列**不是从数据库。 –

+0

'Array.prototype.findIndex()'和'Array.prototype.find()'是你在这个任务中的朋友。 – Redu

回答

1

Haven't使用MongoDB的,但我会用这个想法是先迭代您接触,使手机的映射到相应的对象,将它们标记为不存在:

var obj = {}; 

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

然后以某种方式对具有这些手机在你的数据库的用户搜索,像

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

最后,你遍历你existant记录并标记相应的接触

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

我知道如何添加存在字段,但我不能使用来自User.find()**结果**的“名称”值。 –

+0

@SunnyDhiman你是什么意思?为什么你需要名称值?认为它已经在联系人 – juvian

+0

是的,你的权利联系人数组已经包含“名称”字段,但结果,我会得到后的User.find()包含“名称”值不同于联系人数组。这是我无法使用的方式。而不是只返回数组中的“手机”字段。 –