Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如何在子文档的属性上过滤聚合?_Mongodb_Database_Nosql - Fatal编程技术网

Mongodb 如何在子文档的属性上过滤聚合?

Mongodb 如何在子文档的属性上过滤聚合?,mongodb,database,nosql,Mongodb,Database,Nosql,我目前正在使用MongoDB作为SaltStack上的returner后端,我需要查询数据库,例如,为了获取失败作业的步骤列表,每个jobReturn都是这样一个对象(这里是它的一部分): 例如,在这里,我需要得到这个对象,但是所有的“return”对象都有“result”:false 我试图使用$project,但它只在列表中起作用 我无法修改应用程序放置数据的方式。我同意在这个模式中,对象列表是一个更好的解决方案 最好的方法是什么?我在MongoDB 3.4.4+中找到了使用$objectT

我目前正在使用MongoDB作为SaltStack上的returner后端,我需要查询数据库,例如,为了获取失败作业的步骤列表,每个jobReturn都是这样一个对象(这里是它的一部分):

例如,在这里,我需要得到这个对象,但是所有的“return”对象都有“result”:false

我试图使用
$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] }
            }
        }
    }}
])