2016-10-19 1 views
1

Ich habe 2 Modelle, Alarm und Alert.Wie kann ich alle Dokumente mit einer übereinstimmenden ID mithilfe eines Arrays eines anderen Objekts finden?

Die AlertSchema hat ein created_by Feld, das auf eine Alarm Objekt-ID verweist.

Gegeben eine Reihe von Alarm Objekte, wie kann ich alle entsprechenden Warnungen finden?

Das funktioniert nicht (ich erwartete nicht wirklich)

// Get array of alarm objects 
Alarm.find({unit: req.unit._id}).exec(function(err, alarms){ 
    // Use array of alarm objects to find all alerts 
    Alert.find({created_by: alarms}) 

ist meine beste Wette die _id von jedem Objekt in ein Array zu extrahieren und passieren, dass als Argument wie folgt aus:

Alarm.find({unit: req.unit._id}).exec(function(err, alarms){ 
    var alarm_ids = alarms.map(function(o){return o._id}); 
    // Use array of alarm objects to find all alerts 
    Alert.find({created_by: alarm_ids}) 

Antwort

1

Sie können tatsächlich die Aggregation Rahmen und Abfrage verwenden, um die $lookup Operator, der es möglich macht, eine linke äußere Verknüpfung auf die andere Sammlung zu tun.

Überprüfen Sie das folgende Beispiel:

Alarm.aggregate([ 
    { "$match": { "unit": req.unit._id } }, 
    { 
     "$lookup": { 
      "from": "alerts", 
      "localField": "_id", 
      "foreignField": "created_by", 
      "as": "alarm_alert" 
     } 
    }, 
    { "$unwind": "$alarm_alert "} 
]).exec(function(err, result){ 
    console.log(JSON.stringify(result, null, 4)); 
}); 

Die oben ist effizient, da es eine atomare Abfrage ist und verwendet die nativen Betreiber.


mit Ihrer Lösung Versuch gehen, fehlten Sie die $in Operator als letzte fit zu Ihrem Puzzle aber eine Sache, die die Fliege in der Feier Salbe bringt, ist die Tatsache, dass Sie wiederholte Anrufe machen zu der Server, dh einer, um die Alarmobjekte abzufragen, und ein anderer, um die Alarmsammlung abzufragen, daher ist sie möglicherweise nicht so effizient wie der obige aggregierte Vorgang:

Alarm.find({ "unit": req.unit._id }) 
     .lean() // <-- return plain javascript objects 
     .exec(function(err, alarms){ 
      var alarm_ids = alarms.map(function(o){return o._id}); 
      // Use array of alarm objects to find all alerts 
      Alert.find({ "created_by": { "$in": alarm_ids } }).exec(callback); 
     }); 
Verwandte Themen