MongoDB如何从父键未知的嵌套对象中筛选指定键值子对象
MongoDB 过滤动态键嵌套对象的实现方法
由于data下的子键名无固定规则,普通find查询的投影语法无法直接完成这类动态键过滤,需要通过聚合管道实现,兼容MongoDB 3.4及以上版本,代码如下:
db.yourCollection.aggregate([ // 将动态键对象转换为可遍历的键值对数组 { $addFields: { data: { $objectToArray: "$data" } } }, // 过滤数组,仅保留call字段为true的项 { $addFields: { data: { $filter: { input: "$data", as: "item", cond: { $eq: ["$$item.v.call", true] } } } } }, // 将过滤后的数组转换回原对象结构 { $addFields: { data: { $arrayToObject: "$data" } } } ])
逻辑说明
$objectToArray会把原data对象转换为固定结构的数组:每个数组元素包含k(对应原对象的键名)、v(对应原键的值)两个字段,无需提前知道子键命名即可遍历所有子属性$filter遍历转换后的数组,通过$$item.v.call匹配每个子对象的call字段值,剔除不符合条件的项$arrayToObject将过滤完成的数组重新转为普通对象结构,最终返回结果和预期格式完全一致:
{ data: { second: { call: true }, third: { call: true } } }
注:如果使用3.4以下版本的MongoDB,无法通过内置运算符完成该操作,建议通过应用层查询后过滤,或升级数据库版本。
内容的提问来源于stack exchange,提问作者Hanna
相关产品推荐
相关产品推荐

