Mongoengine: Как фильтровать по полю EmbeddedDocument внутри ListEmbeddedDocumentField? - PullRequest
0 голосов
/ 17 апреля 2020

Возможно, связан с этим вопросом , но на него нет ответов.

У меня есть коллекция моделей, связанных между ними, и сложность модели root значительно возросла. Грубо говоря, моя ситуация выглядит примерно так:

from mongoengine import *

connect("test")


class NotSoComplex(EmbeddedDocument):
    name = StringField()
    value = StringField()


class Complex1(EmbeddedDocument):
    r1 = DictField()
    r2 = EmbeddedDocumentListField(NotSoComplex)    


class Complex2(EmbeddedDocument):
    ...


class VeryComplex(Document):
    r1 = EmbeddedDocumentField(Complex1)
    r2 = EmbeddedDocumentListField(Complex2)

    meta = {"allow_inheritance": False, "collection": "test"}  # , "indexes":["??"]}

Я бы хотел отфильтровать документы VeryComplex на основе value, которые хранятся в EmbeddedDocumentListField. Я имею в виду, я хочу отфильтровать документы, у которых есть какой-то документ в r1.r2 со значением == "Foo". Я не знаю, как это сделать express в запросах фильтра mongoengine, я хотел бы что-то вроде

print (VeryComplex.objects (r1__r2__contains__name = "Foo"))

В идеале я хотел бы также создайте и внесите в указатель это поле, если это возможно.

1 Ответ

0 голосов
/ 17 апреля 2020

Я не уверен, но, кажется, вы можете использовать агрегат ($ match And $ project)

В проекте использовать $ filter

, например:

VeryComplex.objects([{"$match" :{"r1.r2.name" : "FOO"}},
{"$project": {"r1":
                 {"$filter":{"input": "$r1",
                             "as": "r1",
                             "cond":{"$$r1.r2.name" : { $eq: "FOO" }}
                 }
                  }
              }}
])
...