我想创建一个查询或聚合,其中返回的文档不包含子文档。我不知道给定的字段会提前成为子文档(或者我只是使用投影来跳过它们)。例如,如果我有这样的文档:
{
_id: 1,
field1: "a",
field2: "b",
field3: {
subfield1: "c",
subfield2: "d"
}
}
当我的查询返回此文档时,它会跳过field3,或用其他内容替换field3的值(例如string =" field_is_an_object")。
正如我所说,我事先并不知道哪些字段是子文档(或#34;对象"类型)。 $ redact运算符是我能找到的最接近的运算符,但是我无法找到一种语法来使它工作。
答案 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)
}
}
}
}
}
})