Javascript MongoDB-通过比较集合和对象数组返回现有字段的数组
我是Mongo的新手,尝试将数组与集合文档进行比较,并返回匹配记录的列表 让我解释一下:第一个数组 我有一个包含以下文档的集合(用户):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"
> 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;
}