MongoDB-通过比较集合与对象数组

时间:2016-05-13 17:35:35

标签: javascript arrays node.js mongodb mongoose

我是Mongo的新手,并尝试将数组与集合文档进行比较,并返回匹配记录的返回列表。

让我解释一下: 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);
};

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

现在请任何人帮我提供代码或建议正确的方法来获得所需的结果,谢谢

1 个答案:

答案 0 :(得分:1)

我没有使用过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;
}