2016-05-29 8 views
1

私はmongodbコレクションに対して検証しようとしています。コレクション内に配列として格納されたイベントがあります。配列をmongodbコレクション配列に対して検証する

コレクション情報:[New York, Palo Alto, Washington DC]

ユーザ入力:[New York, Palo Alto]

私が収集し、リターンへの入力を比較したい「場所が既に追加されました。」

if(eventcheck.indexOf(addevent) != -1 || null){ 
console.log("already added"); 
}else{ 
console.log("added"); 

のindexOfしかし-1を返していない0を、私は唯一の「ニューヨーク」と入力した場合、私が取得:

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)); 

を次のように私のコードは、私は、私はちょうど、次のような何かを行うことができます考え出しです"already added"というメッセージが表示されますが、両方を試してみると "added"というメッセージが表示されます。

ご協力いただければ幸いです。

答えて

1

あなたは、このために集約フレームワークを使用すると、すべての入力配列に表示される要素を含む配列を返します$setIntersectionようset operatorsの利点を取ることができます。ユーザーが要素["New York", "Palo Alto", "Washington DC"]eventsアレイ上$setIntersectionを適用する配列["New York", "Palo Alto"]を、入力した場合、配列を入力し、コレクションのevents配列、したがって、この結果、両方に共通しているので、 だからあなたの例のために、これは セット["New York", "Palo Alto"]を返します。イベント配列に既に追加されている要素の表示を提供します。

結果が空の配列フィールドをもたらす場合、入力配列の要素はmembersevents配列ではないので、適切な推論を行うことができます。

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"] 
}); 
関連する問題