сопоставить оба поля в EmbedDocuments - PullRequest
0 голосов
/ 09 октября 2019

Мне нужна помощь с фильтрацией mongoengine, пожалуйста. Я пытаюсь отфильтровать 2 поля во встроенных документах. Я хочу, чтобы оба совпадения находились в одном и том же документе, но я не могу понять, как их так содержать.

пример данных:

{
    "_id" : "1",
    "active" : true,
    "booking" : [ 
        {
            "date" : 1,
            "status" : true
        }
    ]
}
{
    "_id" : "2",
    "active" : true,
    "booking" : [ 
        {
            "date" : 1,
            "status" : false
        },
        {
            "date" : 2,
            "status" : true
        }
    ]
}

Я хочу запросить day=1 & status=true и получить только #1 как результат. Однако этот запрос вернул бы и # 1, и # 2, поскольку в документах могут существовать как день, так и статус.

docs.objects.filter(
    Q(active=True) & Q(booking__date=1) & Q(booking__status=True))

Я пробовал несколько разных вещей, но они дают результат намного дальше, чем я ожидал. Такие как эти, которые возвращают пустое.

match = {"$match": {
    "booking.date": 1,
    "booking.status": True
}}
objects = docs.objects.aggregate(match)

или

match = {"$match": {
                "$and": [
                    {
                        "booking.date": 1,
                        "booking.status": True
                    }
                ]
            }}

Может кто-нибудь посоветовать, пожалуйста?

1 Ответ

0 голосов
/ 24 октября 2019

Ваш ответ:

class Booking(EmbeddedDocument):
    date = IntField()
    status = BooleanField(default=True)

class Account(Document):
    active = BooleanField(default=True)
    booking = EmbeddedDocumentListField(Booking)

Account.objects(active=True, booking=Booking(date=1, status=True))

Ключевым моментом является использование целого EmbeddedDocument в качестве критерия соответствия. Также Q(active=True) & Q(booking__date=1) & Q(booking__status=True) полностью эквивалентно active=True, booking__date=1, booking__status=True

...