Mongodb 如何在子文档的属性上过滤聚合?
我目前正在使用MongoDB作为SaltStack上的returner后端,我需要查询数据库,例如,为了获取失败作业的步骤列表,每个jobReturn都是这样一个对象(这里是它的一部分): 例如,在这里,我需要得到这个对象,但是所有的“return”对象都有“result”:false 我试图使用Mongodb 如何在子文档的属性上过滤聚合?,mongodb,database,nosql,Mongodb,Database,Nosql,我目前正在使用MongoDB作为SaltStack上的returner后端,我需要查询数据库,例如,为了获取失败作业的步骤列表,每个jobReturn都是这样一个对象(这里是它的一部分): 例如,在这里,我需要得到这个对象,但是所有的“return”对象都有“result”:false 我试图使用$project,但它只在列表中起作用 我无法修改应用程序放置数据的方式。我同意在这个模式中,对象列表是一个更好的解决方案 最好的方法是什么?我在MongoDB 3.4.4+中找到了使用$objectT
$project
,但它只在列表中起作用
我无法修改应用程序放置数据的方式。我同意在这个模式中,对象列表是一个更好的解决方案
最好的方法是什么?我在MongoDB 3.4.4+中找到了使用
$objectToArray
表达式的解决方案:
db.saltReturns.aggregate([
{ $match: { "fun": { $eq: "state.apply" }}},
{ $project: {
matches: {
$filter: {
input: { $objectToArray: "$return" },
as: "return",
cond: { $eq: ["$$return.v.result", true] }
}
}
}}
])
看看这是否有帮助。您还应该学习使用
$objectToArray
作为$filter
的“input”
选项的参数,而不是使用单独的$project
阶段。原因是“实际发生的”是$project
运行一个传递“所有数据”的过程为了做出改变。因此,您基本上是两次浏览所有结果。另一个教训是,我们现在正在“强制使用数组”,以实际使用它做一些有建设性的事情。这是一个指标,表明您的数据首先应该采用这种结构。这将提供一个性能查询。
db.saltReturns.aggregate([
{ $match: { "fun": { $eq: "state.apply" }}},
{ $project: {
matches: {
$filter: {
input: { $objectToArray: "$return" },
as: "return",
cond: { $eq: ["$$return.v.result", true] }
}
}
}}
])