mongodb聚合$ redact来过滤数组元素

时间:2017-06-22 23:22:12

标签: mongodb aggregation-framework

在mongodb 3.4.5中,请考虑以下简单集合ooo

{ "id" : 1, "to" : [ { "id" : 2 }, { "id" : 4, "valid" : true } ] }

如果$redact ,请to valid

db.ooo.aggregate([{ "$redact": {
    "$cond": {
         "if": { "$ne": [ "$valid", true] },
         "then": "$$KEEP",
         "else": "$$PRUNE"
    }
}}])

结果:

{ "id" : 1, "to" : [ { "id" : 2 } ] }

但是当条件改为valid 为真时:

db.ooo.aggregate([{ "$redact": {
    "$cond": {
         "if": { "$eq": [ "$valid", true] },
         "then": "$$KEEP",
         "else": "$$PRUNE"
    }
}}])

结果是空的。

1 个答案:

答案 0 :(得分:0)

$redact从顶层向下遍历整个文档,"$valid": true部分无法在顶层传递(顶层没有valid字段),然后是{{1} }是$$ROOT d,没有任何回报。

解决方案(跳过这个,见下文更新):

$$PRUNE

<强>更新

根据@ neil的评论,我更正了答案:

db.ooo.aggregate([{ "$redact": {
    "$cond": {
         "if": { $or: ["$to", {"$eq": [ "$valid", true]}] },
         "then": "$$KEEP",
         "else": "$$PRUNE"
    }
}}])

显示预期结果:

db.ooo.aggregate([{ "$redact": {
    "$cond": {
         "if": { $or: ["$to", {"$eq": [ "$valid", true]}] },
         "then": "$$DESCEND",
         "else": "$$PRUNE"
    }
}}])

这是{ "id" : 1, "to" : [ { "id" : 4, "valid" : true } ] } 被修剪。