【问题标题】:MongoDB- Return Array of existing fields by compare collection with Array of objectMongoDB-通过将集合与对象数组进行比较来返回现有字段的数组
【发布时间】:2016-09-10 00:16:50
【问题描述】:

我是 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"
            }
         ]
} 

现在我想知道 Second Array 的哪些对象存在于 First Array 中,哪些不存在。比较应该仅基于手机。结果我想要与 Second Array 相同的数组,但有一个额外的字段 "exists":"true" 或 "exists":"false" 。像这样的。

{
   "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 {} 空结果,并且如果我试图在回调函数中获得响应,那么它只返回单个最后比较值。 问题第一种方法是回调函数返回结果很晚所以结果总是空的。 并且在 second method 循环覆盖结果,并且在循环内使用回调也效率低下,它会调用没有时间。所以我已经解释了整个故事

现在请任何人帮助我编写代码或建议正确的方法以获得所需的结果,谢谢

【问题讨论】:

  • 从未使用过 mongodb,但您不能制作一系列手机,在您的数据库中搜索所有这些手机(我相信是 Users.find)并一次处理所有这些手机吗?这样你只需要管理一个回调
  • @juvian 我很欣赏你的建议,我曾尝试使用 $in 运算符,但它返回所有匹配结果(整个文档数据)。但是如何知道哪些记录未找到并准备带有 exists 字段的数组。还有一件事(用户集合)“名称”值和 Second Array“名称”字段值可以不同。所以我希望名称值与 Second Array 相同,而不是来自 DB。
  • Array.prototype.findIndex()Array.prototype.find() 是你在这个任务中的朋友。
  • @juvian 其实 User Collection 是注册用户的记录,而 Contact Array 用作第二个数组是 Contacts List of user Mobile Phone ,我的工作只是将用户移动联系人列表与注册用户匹配,并返回与联系人列表相同的 exists 字段以告知数据库中是否存在。
  • 我可以假设手机是独一无二的吗?

标签: javascript arrays node.js mongodb mongoose


【解决方案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)

最后,你迭代你现有的记录并标记对应的联系人

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

【讨论】:

  • 我知道如何添加存在字段,但我不能使用 User.find() result 中的“名称”值。
  • @SunnyDhiman 你是什么意思?为什么需要名称值?以为它已经在联系人中了
  • 是的,你说得对 Contacts Array 已经包含“name”字段,但是在 User.find() 之后我将得到的结果包含“name”值与 Contacts Array 不同。那是我不能使用的方式。而不是只返回数组中的“电话”字段。
  • 我只使用 user.find 结果中的电话,根本没有使用名称。 Obj 将拥有来自联系人、电话以及电话是否存在于您的数据库中的名称。你不返回结果,你返回 obj
  • 非常感谢 朱维安
猜你喜欢
  • 2019-09-07
  • 1970-01-01
  • 2015-08-31
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多