根据MongoDB收集数组validation数组

我正在尝试对我的mongodb集合进行validation。 我们将事件作为数组存储在集合中。

收集信息: [New York, Palo Alto, Washington DC]

用户input: [New York, Palo Alto]

我想比较input到收集和返回“位置已经添加”。 我的代码如下

 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.如果我只input一个“纽约”,我会得到“已经添加”的消息,但是如果我尝试了两个,我就会得到“已添加”消息。

任何帮助,将不胜感激。

你可以使用这个聚合框架,并利用像$setIntersection这样的集合运算符 ,它将返回一个包含出现在每个input数组中的元素的数组。 因此,举例来说,如果用户input["New York", "Palo Alto"]arrays,在元素["New York", "Palo Alto", "Washington DC"]events数组上应用$setIntersection ,将返回set ["New York", "Palo Alto"]因为数组对于input和集合的events数组都是通用的,因此这个结果会给你一个已经添加到events数组中的元素的指示。

如果结果带有一个空的数组字段,则input数组中的元素不是events数组的members ,因此您可以进行适当的推理。

 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"] });