2016-05-29 32 views
1

我想驗證我的蒙古語集合。我們將事件作爲數組存儲在集合中。驗證陣列對蒙古語集合數組

收集信息:[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

你可以使用聚合框架,這和利用set operators$setIntersection將返回包含出現在每個輸入數組元素的數組。 因此,對於你的例子,如果用戶輸入陣列["New York", "Palo Alto"],該events數組元素["New York", "Palo Alto", "Washington DC"]上應用$setIntersection,這將返回 設定["New York", "Palo Alto"]因爲數組是常見的輸入和收集的events數組,因此這個結果會給你一個已經添加到events數組中的元素的指示。

如果結果引入一個空數組字段,那麼輸入數組中的元素不是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"] 
});