2017-02-11 4 views
0

Ich versuche, MongoDB mit Mongoose abzufragen, um Dokumente basierend auf dem Wert einer verschachtelten Eigenschaft zu finden.Abfrage geschachtelte Eigenschaft in Mongoose (ohne Punktnotation)

Aufgrund der Art, wie die Daten empfangen werden, muss ich die Abfrage ohne Punktnotation durchführen (wie unten zu sehen).

Obj.find({'mainProperty.nestedProp': 'value'}) 

Der obige Code wird mir die richtigen Ergebnisse erhalten, aber ich muss unten in den Abfragebedingungen im Format zu übergeben.

Obj.find({ mainProperty: { nestedProp1: 'value' } }) 

ich auf der Client-Seite in dem gesamten Abfrage-Objekt als Argument bin vorbei, anstatt die Abfrage auf dem Server zu entwickeln. Wenn es den Server erreicht, erscheint der obige Code wie unten gezeigt.

Da in mainProperty zwei Eigenschaften verschachtelt sind, ist die obige Suche nicht zulässig. Es wird nach Dokumenten gesucht, bei denen mainProperty genau dem entspricht, was nach dem Doppelpunkt übergeben wird (dh Dokumente, deren Wert gleich nestedProp1 ist und kein nestedProp2 aufweist).

Gibt es eine andere Möglichkeit, dies aufzurufen (ohne Punktnotation oder Bearbeiten des Objekts selbst), wo es nach dem Wert von nestedProp1 und nicht nach dem Wert von mainProperty fragt?

Antwort

0

Es ist, Sie so etwas wie

const filter = {}; 

// check if you have specified nestedProp1 
if (req.body.nestedProp1) { 
    filter['mainProperty.nestedProp1'] = req.body.nestedProp1; 
} 

if (req.body.nestedProp2) { 
    filter['mainProperty.nestedProp2'] = req.body.nestedProp2; 
} 

// and then 
Obj.find(filter); 

So tun könnte, wenn Sie den Filter festgelegt haben, werden Sie gefilterten Datensätze erhalten, andernfalls die Standardeinträge.

Ich habe den Code nicht getestet, so dass, wenn dies nicht funktioniert, können Sie versuchen, filter['mainProperty']['nestedProp1'] = req.body.nestedProp1;

+0

Danke für die Antwort! Dies ist definitiv ein sauberer Weg, um es im kleinen Maßstab zu tun, aber in der realen Anwendung habe ich 8 nicht geschachtelte Eigenschaften und 5 geschachtelte Eigenschaften. Darüber hinaus variieren die Eigenschaften, die zur Abfrage jedes Mal übergeben werden. Ich hoffe zu vermeiden, eine große if-Anweisung zu verwenden, um festzustellen, was verwendet wird und die Eigenschaften konvertieren. Ich hätte angeben sollen, dass ich viel mehr Eigenschaften habe, wenn ich die Frage stelle, und ich schätze die Hilfe! –

0

tun können Sie die meisten Mongo DB-Syntax mit Mongoose find() verwenden. Versuchen Sie folgendes:

Obj.find({ mainProperty: { nestedProp1: { $in: ['value'] } } })

Mongo docs

+0

Danke für die Antwort, aber der Grund hinter der Punktnotation ist, dass ich die Abfrage bereits als Objekt gespeichert habe. Ich möchte abfragen können, ohne das Objekt zu bearbeiten, und die Verwendung von $ in erfordert immer noch, dass ich in das Objekt gehe und Änderungen vornehme. Ich werde die Frage aktualisieren, um genauer über die Anforderungen zu sein. –

Verwandte Themen