Запрос с несколькими условиями для вложенной записи в MongoEngine

У меня есть документ A, который содержит ListField b определенного типа EmbeddedDocument B, который имеет два StringFields x и y.

class B(EmbeddedDocument):
    x = StringField()
    y = StringField()

class A(Document):
    b = ListField(EmbeddedDocumentField(B))

Сначала заполним их:

b1 = B(x="x1", y="y1")
b2 = B(x="x2", y="y2")
a = A(b=[b1, b2])
a.save()

Я хочу найти экземпляр A, который содержит определенную запись B со значениями x=x1 и y=y1.

Я попытался построить запрос с двумя contains, по одному для каждого значения.

A.objects(b__x__contains="x1", b__y__contains="y1")
[<A: A object>]

Случай успеха работает. Проблема в том, что условия независимы, тогда им могут соответствовать разные записи списка b:

A.objects(b__x__contains="x1", b__y__contains="y2")
[<A: A object>]

Есть ли способ в MongoEngine гарантировать, что эти два условия будут применяться в одной и той же записи?

Заранее спасибо.


person Emanuel Vianna    schedule 23.08.2014    source источник


Ответы (2)


Насколько я понимаю ваш вопрос. Вы можете попробовать $elemMatch

Eg: Find Query

db.A.findOne(
   {
     b : {$elemMatch : {"x":"x1", "y":"y1"}}
   }
);

Надеюсь, что это поможет вам.

person Newbie    schedule 23.08.2014
comment
Привет, Афил, большое спасибо за быстрый ответ! Хотелось бы сделать это желательно через MongoEngine. Если у меня не получилось это сделать, приятно вспомнить, что я могу сделать вызов MongoDB в MongoEngine и использовать $elemMatch. С наилучшими пожеланиями! - person Emanuel Vianna; 23.08.2014

Я нашел ответ в выпуске #379 на MongoEngine Github.

$elemMatch был сопоставлен с field__match.

Таким образом, случай успеха работает:

A.objects(b__match={"x": "x1", "y": "y1"})
[<A: A object>]

И неправильный случай один терпит неудачу:

A.objects(b__match={"x": "x2", "y": "y1"})
[]

Большое спасибо Afil, чтобы показать мне, что то, что мне нужно, эквивалентно $elemMatch.

person Emanuel Vianna    schedule 23.08.2014