2017-07-10 5 views
2

Lassen Sie uns wählen sagen, dass ich diese Werte in der Datenbank haben:Wie nur ein Element eines Arrays innerhalb eines Mongoose.find

{ 
    name: '1', 
    values: [{ 
     subname: 'awesome' 
    }, { 
     surname: 'cool' 
    }] 
} 

wie konnte ich das Array-Filter mit nur den Wert Ich habe Interesse an ?

Ich möchte als Ergebnis meiner Entdeckung erhalten:

Ich dachte, vielleicht gibt es eine Möglichkeit, mit ausgewählten ist? So etwas wie

MyCollection.find({name: '1'}).select(BLACK_MAGIC); 

Wo BLACK_MAGIC filtert meine Array mit den Werten interessiert mich, in diesem Beispiel values.subname = 'awesome'

Thx im Voraus für alle Ideen

Randbemerkung: Ich bin interessant, dies mit Mongoose Abfragen und Funktionen zu lösen, nicht eine Lösung mit einem Post-Javascript auf dem resultierenden Array

+0

Vielleicht [$ elemMatch] (https://docs.mongodb.com/manual/reference/operator/projection/elemMatch/) könnte nützlich sein. – Mikey

+0

Thx @Mikey, sehen Sie aus, als ob Sie Recht haben, die Beispiele der Dokumentation scheinen meine Bedürfnisse zu erfüllen ... werde lernen und es versuchen! –

+0

@Mikey es ist eine Art von Arbeit, aber erfüllt nicht 100% was ich suche. Doing Collection.find ({something}, {$ elementMatch}) wird {_id, theElementMatched} zurückgeben, aber ich möchte {_id, alles andere, theElementMatched} zurückgeben. –

Antwort

1

Ich denke, Sie könnten aggregation dafür verwenden.

Sie würden $unwind, so dass jedes values Objekt in einem separaten Dokument ist.

Dann filtern Sie die Ergebnisse mit $match.

MyCollection.aggregate([ 
    { 
     $unwind: '$values' 
    }, 
    { 
     $match: { 
      'values.subname': 'awesome' 
     } 
    }, 
    // EDIT 
    { 
     $group: { 
      _id: '$_id', 
      name: { 
       $first: "$name" 
      }, 
      values: { 
       $push: { subname: "$values.subname" } 
      } 
     } 
    } 
], function (err, results) { 

}); 

Wenn es funktioniert, sind Sie ein bisschen näher. Die einzige Sache ist, dass values ein Objekt ist, kein Array eines Objekts. Sie könnten wahrscheinlich $group mit $first verwenden, um das gewünschte Ergebnis zu erhalten.

+0

cool thx für die Antwort. Aggregation und Entspannung wie du es beschrieben hast! –

Verwandte Themen