如何在过滤器和投影中查询mongodb通配符子字段



我有这样的文档结构:

{
"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"}}}
])

看看它是如何在操场上工作的例子

最新更新