【发布时间】:2014-02-12 07:34:53
【问题描述】:
我有一个案例,我想查询一个文档集合,这些文档在数组字段“表单”下具有多个项目。要解决的问题是希望仅返回所有文档包含在“表单”中且特定状态为“关闭”的文档。
所以这里是集合中两个不同文档的示例:
{
"_id" : "Tvq444454j",
"name" : "Jim",
"forms" : [
{
"name" : "Jorney",
"status" : "closed"
},
{
"name" : "Women",
"status" : "void"
},
{
"name" : "Child",
"status" : "closed"
},
{
"name" : "Farm",
"status" : "closed"
}
]
},
{
"_id" : "Tvq579754r",
"name" : "Tom",
"forms" : [
{
"name" : "PreOp",
"status" : "closed"
},
{
"name" : "Alert",
"status" : "closed"
},
{
"name" : "City",
"status" : "closed"
},
{
"name" : "Country",
"status" : "closed"
}
]
}
以及预期的结果:
{
"_id" : "Tvq579754r",
"name" : "Tom",
"forms" : [
{
"name" : "PreOp",
"status" : "closed"
},
{
"name" : "Alert",
"status" : "closed"
},
{
"name" : "City",
"status" : "closed"
},
{
"name" : "Country",
"status" : "closed"
}
]
}
由于在这种情况下没有标准的查询运算符来匹配数组的所有元素,因此通过聚合找到了解决方案。这将返回集合中所有“表单”元素都设置为“关闭”状态的文档的 _id。
db.forms.aggregate([
{$unwind: "$forms" },
{$group: { _id: "$_id", status: {$addToSet: "$forms.status" }}},
{$unwind: "$status"},
{$sort: { _id: 1, status: -1 }},
{$group: {_id: "$_id", status: {$first: "$status"}}},
{$match:{ status: "closed" }}
])
因此,由于我希望在结果中返回许多文档,因此我想避免发出另一个查找或一系列查找,只是为了获取与返回的 _id 匹配的文档。
考虑到这一点,有什么方法可以让我从聚合中获取与集合中完全相同的形式的原始文档,同时仍然进行这种类型的过滤?
【问题讨论】:
标签: mongodb mongodb-query aggregation-framework