#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
.