2013-03-28 5 views
7

Ich habe folgendes Schema des:Wie wird das übergeordnete Dokument basierend auf Filialdokumentwerten in Mongoose abgerufen?

var Child = new mongoose.Schema({ 
    'field': String, 
    'value': String 
    }); 

var Parent = new mongoose.Schema({ 
    'name': String, 
    'children': [ Child ] 
    }); 

Ich möchte die Parent, für die einer der Child ‚s entspricht der folgenden JSON-Objekt zurückgeben:

{ 'field': 'Family Name', 'value': 'Smith' } 

ich das versucht habe:

Parent.findOne({ 'children': { 'field': 'Family Name', 'value': 'Smith' } }, fn ...) 

aber es wird immer wieder abgerufen null.

EDIT:

Prüfung durch die Erweiterung Mongo Shell, fand ich heraus, dass die Child Unterlagen ihrer eigenen _id ‚s haben. Wenn ich das _id der Abfrage hinzufüge, ruft es das parent Dokument ab. Jetzt weiß ich nicht im Voraus, was dieses Kind id sein wird. Also: Wie kann ich es aus der Sub-Dokument-Abfrage entfernen? (Mit anderen Worten, die obige Abfrage sieht buchstäblich für ein Objekt JSON mit nur zwei Eigenschaften, während die Unterdokumente drei haben)

Meine Umgebung ist: Node.js, Mongoose, MongoDB

+1

Wenn Sie das unterordnete Objekt haben, können Sie 'child.parent()' aufrufen. Wenn Sie das nicht tun, dann müssen Sie danach fragen. – tbeseda

+0

Ich habe nicht das "Kind" -Objekt, daher die Abfrage. Aber die Abfrage selbst scheint keine "Eltern" zu holen ... –

Antwort

3

Gibt es einen Grund verwenden Sie Feld, Wertstruktur auf den untergeordneten Dokumenten? Es wäre einfacher, einfach den Schlüssel als Feld zu verwenden, wie {"FamilyName": "Smith"}. Dies würde es ermöglichen so etwas wie:

Parent.findOne({'children.FamilyName': 'Smith}, function(err, doc){...}); 
+0

In der Tat, aber ich habe ein dynamisches Modell daher die etwas erweiterte Struktur. In der Zwischenzeit habe ich die Lösung gefunden; werde es in einer zweiten –

10

Es scheint, die $elemMatch der Abfrage-Operator ist, dieses Problem zu lösen. Die tatsächliche Abfrage sollte wie folgt geschrieben werden:

Parent.findOne({ 'children': { $elemMatch: { 'field': 'Family Name', 'value': 'Smith' } } }, fn ...) 
+0

posten Ich versuche herauszufinden, wie $ elemMatch Arbeit an einem Sub-Sub-Sub-Dokument zu machen. Hast du so etwas probiert? – user323774

Verwandte Themen