我正在尝试验证我的mongodb集合。我们将事件存储为集合中的数组。
收集信息:[New York, Palo Alto, Washington DC]
用户输入:[New York, Palo Alto]
我想比较集合的输入并返回“已添加的位置”。我的代码如下
var addevent = req.body.events;
var addeventarr = addevent.split(',');
Event.findOne({'location': eventloc }, 'events', function(err, event) {
var eventcheck = event.events;
console.log(eventcheck.indexOf(addeventarr));
我想我可以做类似以下的事情:
if(eventcheck.indexOf(addevent) != -1 || null){
console.log("already added");
}else{
console.log("added");
然而indexOf返回-1而不是0.如果我只输入一个“纽约”,我会收到“已添加”消息,但如果我同时尝试这两个消息,则会收到“已添加”消息。
任何帮助都将不胜感激。
答案 0 :(得分:1)
您可以使用聚合框架并利用set operators之类的 $setIntersection
,它将返回一个包含每个输入数组中出现的元素的数组。
因此,对于您的示例,如果用户输入数组["New York", "Palo Alto"]
,则使用元素events
在["New York", "Palo Alto", "Washington DC"]
数组上应用 $setIntersection
,这将返回
set ["New York", "Palo Alto"]
,因为数组对于输入和集合的events
数组都是通用的,因此这个结果将指示已经添加到events数组中的元素。
如果结果带来一个空数组字段,那么输入数组中的元素不是members
数组的events
,因此您可以进行适当的推理。
var addevent = req.body.events;
var addeventarr = addevent.split(',');
Event.aggregate([
{ "$match": { 'location': eventloc } },
{
"$project": {
"commonEvents": { "$setIntersection": [ "$events", addeventarr ] }
}
}
], function(err, result) {
console.log(result[0].commonEvents); // prints ["New York", "Palo Alto"]
});