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

Javascript MongoDB-通过比较集合和对象数组返回现有字段的数组,javascript,arrays,node.js,mongodb,mongoose,Javascript,Arrays,Node.js,Mongodb,Mongoose,我是Mongo的新手,尝试将数组与集合文档进行比较,并返回匹配记录的列表 让我解释一下:第一个数组 我有一个包含以下文档的集合(用户): > db.user.find().pretty() { "_id" : ObjectId("57358220bf3e7d076b6ccdb1"), "name" : "Sunny", "phone" : "9417702107", "email" : "ssdhiman07@gmail.com" } { "_id"

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

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

我有一个包含以下文档的集合(用户):

> 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"
            }
          ]
  }
因此为此,我尝试了node.js与mongoos的代码

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);
};
exports.matchcontacts=函数(请求、回复、下一步) { var响应={}; var conArray=req.body.contacts; var联系人列表=[];
对于(var i=0;i而言,我还没有使用mongodb,但我的想法是首先迭代您的联系人,将手机映射到相应的对象,并将其标记为不存在:

var obj = {};

for(var i=0; i<conArray.length;i++){
    obj[conArray[i].phone] = conArray[i];
    conArray[i].exists = false;
}
最后,迭代现有记录并标记相应的联系人

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

for(var i=0;我从未使用过mongodb,但你不能制作一个电话数组,在数据库中搜索所有这些电话(Users.find,我相信),然后一次处理所有电话吗?这样你只需要管理一个callback@juvian我很感谢您的建议,并且我已经尝试使用$in运算符来实现这一点,但它会返回所有匹配结果(整个文档数据)。但如何知道哪些记录未找到,并使用exists字段准备数组。还有一件事(用户集合)“name”vale和第二个数组“name”字段值可能不同。因此,我希望名称值与第二个数组相同,而不是来自DB。
Array.prototype.findIndex()
Array.prototype.find()
你是这个任务中的朋友吗。@juvian实际上用户集合是注册用户的记录,联系人数组用作第二个数组是用户手机的联系人列表,我的工作就是将用户手机联系人列表与注册用户匹配,并返回与联系人列表相同的字段,以通知是否存在于数据库中。我可以假设吗电话是唯一的?我知道如何添加exists字段,但我不能使用User.find()结果中的“name”值。@SunnyDhiman你是什么意思?你为什么需要name值?我想它已经存在于Contacts上了。你对的Contacts数组已经包含“name”字段,但我在User.find()之后得到的结果包含“name”值与联系人数组不同。这是我无法使用的方式。并且不能只返回“phone”数组中的字段。我只使用用户结果中的电话。在那里查找,根本不使用名称。Obj将使用联系人、电话中的名称,如果电话存在或不存在于您的数据库中。如果不返回结果,则返回objTHANKS很多
for(var i=0;i<results.length;i++){
    obj[results[i].phone].exists = true;
}