MongoDB查询或聚合以跳过子文档

时间:2017-10-17 15:47:46

标签: mongodb mongodb-query aggregation-framework

我想创建一个查询或聚合,其中返回的文档不包含子文档。我不知道给定的字段会提前成为子文档(或者我只是使用投影来跳过它们)。例如,如果我有这样的文档:

{
  _id: 1,
  field1: "a",
  field2: "b",
  field3: {
    subfield1: "c",
    subfield2: "d"
  }
}

当我的查询返回此文档时,它会跳过field3,或用其他内容替换field3的值(例如string =" field_is_an_object")。

正如我所说,我事先并不知道哪些字段是子文档(或#34;对象"类型)。 $ redact运算符是我能找到的最接近的运算符,但是我无法找到一种语法来使它工作。

1 个答案:

答案 0 :(得分:0)

至少有两种方法可以达到你想要的效果:

第一个非常简洁,只需要一个聚合阶段,然而,这个阶段更复杂,更难理解:

^\d( (-?)[\d]+)*\b$ 

我能想到的第二个方法是通过逐步添加阶段(一如既往地使用聚合框架),更加冗长但很容易理解。

db.collection.aggregate({
    $replaceRoot: { // create a new top level document
        "newRoot": { // ...which shall be
            $arrayToObject: { // ...created from an array
                $filter: { // ...that again should contain only those elements
                    input: { // ...from our input array
                        $objectToArray: "$$ROOT" // ...which is our respective top level document transformed into an array of key-value pairs
                    },
                    cond: { // ...where
                        $ne: [ { $type: "$$this.v" }, "object" ] // ...the "v" (as in "value" field is not an object)
                    }
                }
            }
        }
    }
})