针对mongodb集合数组

时间:2016-05-29 16:56:00

标签: javascript node.js mongodb validation

我正在尝试验证我的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.如果我只输入一个“纽约”,我会收到“已添加”消息,但如果我同时尝试这两个消息,则会收到“已添加”消息。

任何帮助都将不胜感激。

1 个答案:

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