我有这样的文档结构:
{
"1": {
"type1": 1,
"type2": 2
},
"2": {
"type1": 11,
"type2": 12
}
}
// There can by multiple values at all levels, not just 2
现在我想用一个过滤器查询所有的type2
,概念上是:
"*.type2" > 10
我也只想返回一个字段,这样结果看起来会是这样的:
{
"10": {
"type2": 20
},
"20": {
"type2": 25
}
}
是否可以在MongoDB中通过一个查询实现?
一个选项是迭代键,只保留值大于10的type2
。为了对密钥进行迭代,我们使用$objectToArray
。为了只保留type2
,我们使用$reduce
来迭代(这允许格式化项目(,而不是简单的$filter
,它只返回未格式化的匹配项目。最后一步只是将数组格式化回字典。
db.collection.aggregate([
{$project: {
_id: 0,
data: {$reduce: {
input: {$objectToArray: "$$ROOT"},
initialValue: [],
in: {$concatArrays: [
"$$value",
{$cond: [
{$gt: ["$$this.v.type2", 10]},
[{k: "$$this.k", v: {type2: "$$this.v.type2"}}],
[]
]}
]}
}}
}},
{$replaceRoot: {newRoot: {$arrayToObject: "$data"}}}
])
看看它是如何在操场上工作的例子