2016-04-12 11 views
3

mongoengineに埋め込まれたすべてのドキュメントを含むリストをクエリする必要があります。ここに私のスキーマは次のとおりです。MongoEngineの埋め込みドキュメントリスト

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

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

私はとのmongoシェルを使用してそれを行うことができます。

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

しかし、私はmongoengineでそれを行う方法を把握していません。ドキュメントのリストは、クエリに入れたリストとまったく同じです。何か案は?

答えて

4

実際、シェルでも「間違って」実行していました。使用しているフォーマットには、完全一致が必要です。実際に条件に一致することはめったにありません。確かに配列の内部キーを別の順序で格納する必要はありません。または配列自体が実際に複数の要素を格納していることが最も重要です。

「シェル」の正しい形式は次のようになります。

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

同様に、MongoEngineための「正しい」形式は次のとおりです。

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

ここ__match構造は同じですクエリとして実際に$elemMatch文を基になるMongoDBデータベースにクエリとして発行します。 「シングル」要素のための一般的な「二重のアンダースコア」構文を調整することを

注意だけで結構です。

Sku.objects(variants__name="xxx") 

しかし、「複数」の条件および/または配列/リスト内の要素のために、あなたは$elemMatchを必要としますMongoDBのクエリとしては__matchとなります。

+0

アレイに2つの要素が必要な場合はどうなりますか?同様に、 db.sku.find({バリアント:[{'name': 'xxx'、 'value': 'xxx'}、{'name': 'yyy'、 'value': 'yyy'}}} ).pretty() –

+1

@JoeyHuこれはあなたが尋ねたものとは異なる質問であり、これはあなたが「実際に尋ねられる」質問にのみ答えます。新しい質問がある場合は、[新しい質問をする](http://stackoverflow.com/questions/ask)を参照してください。これは、ここでは1つの質問と1つの決定的な回答としてそれを行う方法です。 [あなたが尋ねたこの質問は答えられます](http://stackoverflow.com/help/accepted-answer)。 –

関連する問題