2016-04-12 3 views
3

Мне нужен запрос списка со всеми встроенными документами в mongoengine. Вот моя схема:Запрос списка встроенных документов в MongoEngine

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

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

Я могу сделать это с помощью Монго оболочки с:

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

Что делать, если мне нужны два элемента в массиве? Например: db.sku.find ({варианты: [{'name': 'xxx', 'value': 'xxx'}, {'name': 'yyy', 'value': 'yyy'}]}) .pretty() –

+1

@JoeyHu Это другой вопрос к тому, что вы просили, и это отвечает только на вопрос, который вы «действительно попросили». Если у вас есть новый вопрос, тогда [Задайте новый вопрос] (http://stackoverflow.com/questions/ask). Вот как мы это делаем, как один вопрос и один окончательный ответ. [На этот вопрос вы ответили] (http://stackoverflow.com/help/accepted-answer). –

Смежные вопросы