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

#mongodb

#mongodb

Вопрос:

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

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

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

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

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

     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"
                }
            ]
        }
  

Ответ №1:

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

 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"
        }
    ]
}
  

Ответ №2:

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