2016-04-12 8 views
3

Ich brauche eine Liste mit allen eingebetteten Dokumenten in Mongoengine abfragen. Hier ist mein Schema:Abfrage Embedded Document List in MongoEngine

class Variant(EmbeddedDocument): 
    name = StringField(required=True) 
    value = StringField(required=True) 

class Sku(Document): 
    variants = ListField(EmbeddedDocumentField(Variant)) 

ich tun kann, es Mongo-Shell mit:

db.sku.find({variants: [{'name': 'xxx', 'value': 'xxx'}]}).pretty() 

Aber ich habe nicht einen Weg finden, um es in mongoengine zu tun. Ich brauche die Liste im Dokument ist genau das gleiche mit der Liste, die ich in die Abfrage gestellt habe. Irgendwelche Ideen?

Antwort

4

Eigentlich machst du es auch "falsch" in der Shell. Das von Ihnen verwendete Format erfordert eine genaue Übereinstimmung, die "selten" tatsächlich den Bedingungen entspricht. Es wäre sicherlich nicht so, dass die inneren Schlüssel des Arrays in einer anderen Reihenfolge, oder gespeichert werden sollten, am wichtigsten, dass das Array selbst mehr als ein Element gespeichert hat.

Die richtige Form für die "Schale" wäre:

db.sku.find({ "variants": { "$elemMatch": { "name": "xxx", "value": "xxx" } } }) 

Aus dem gleichen Grund, die "richtige" Form für MongoEngine ist:

Sku.objects(variants__match={ "name": "xxx", "value": "xxx" }) 

Das hier __match Konstrukt ist das gleiche Sache als, und tatsächlich eine $elemMatch Anweisung in der Abfrage an die zugrunde liegende MongoDB-Datenbank als eine Abfrage ausgibt.

Beachten Sie, dass für ein „single“ Element der allgemeine „Doppelstrich“ Syntax Zustand ist gut so:

Sku.objects(variants__name="xxx") 

Aber für „mehr“ Bedingungen und/oder Elemente innerhalb des Arrays/Liste, die Sie benötigen $elemMatch als eine MongoDB-Abfrage und daher __match.

+0

Was ist, wenn ich zwei Elemente im Array brauche? Wie: db.sku.find ({variants: [{'name': 'xxx', 'wert': 'xxx'}, {'name': 'yyy', 'wert': 'yyy'}]}) .pretty() –

+1

@JoeyHu Das ist eine andere Frage als das, was Sie gefragt haben, und das beantwortet nur die Frage, die Sie tatsächlich gestellt haben. Wenn Sie eine neue Frage haben, dann [Stellen Sie eine neue Frage] (http://stackoverflow.com/questions/ask) statt. So machen wir das hier als eine Frage und eine definitive Antwort. [Diese Frage wurde beantwortet] (http://stackoverflow.com/help/accepted-answer). –

Verwandte Themen