MongoDB, как найти все вложенные документы, соответствующие критериям

Я пытаюсь запросить все документы, соответствующие критериям вложенного документа/объекта.

Как создать запрос, который находит все соответствующие вложенные документы/объекты?

Вот коллекция:

document = { _id: ObjectId("..."),
            product: "ABC", 
            actions: [
                {
                    customer: "Foo",
                    status: "SOLD"
                },
                {
                    customer: "Bar",
                    status: "NOT SOLD"
                },
                {
                    customer: "John", 
                    status: "SOLD"
                },
                {
                    customer: "Doe", 
                    status: "WAITING"
                }
            ]
        }

Вот мой код, который возвращает все документы с одним действием.статус = ПРОДАНО, но возвращает только первый вложенный документ в действиях.

    def query(collection):
        """
        Find all products that have been sold to one or more customers
        """
        query = {"actions.status":"SOLD"}
        options = {"product":1, "actions.$":1}

        res = collection.find(query, options)

Результат, который я хочу, это все продукты и все клиенты со статусом = ПРОДАНО, но мой запрос возвращает только первого клиента со статусом = ПРОДАНО.

Итак, что я хочу, это

    document = { _id: ObjectId("..."),
            product: "ABC", 
            actions: [
                {
                    customer: "Foo",
                    status: "SOLD"
                }, 
                {
                    customer: "John", 
                    status: "SOLD"
                }
            ]
        }
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
0
0
244
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Попробуйте, как показано ниже:

db.collection.aggregate([
    {
        $project: {
            product:1,
            actions: {
                $filter: {
                    input: "$actions",
                    as: "act",
                    cond:  { $eq: ["$$act.status", 'SOLD' ] }
                }
            }
        }
    }    
])

Результат:

{
    "_id" : ObjectId("5cadfaff3d124a151f633af7"),
    "product" : "ABC",
    "actions" : [
        {
            "customer" : "Foo",
            "status" : "SOLD"
        },
        {
            "customer" : "John",
            "status" : "SOLD"
        }
    ]
}

MongoDB не имеет возможности «фильтровать» это в standard query. Единственные инструменты, которые MongoDB действительно имеет для этого уровня manipulation is with the aggregation framework.

Другие вопросы по теме