MongoDB聚合查询:提取文档中指定属性为True的字段名
MongoDB聚合查询:提取嵌套属性中flag为true的属性名数组
直接用以下聚合管道就能实现你要的效果,既过滤出至少有一个flag为true的文档,又把符合条件的属性名转换成数组:
db.collection.aggregate([ // 过滤出至少包含一个flag为true的文档 { $match: { $expr: { $gt: [ { $size: { $filter: { input: { $objectToArray: "$houseDetails" }, cond: { $eq: ["$$this.v.flag", true] } } } }, 0 ] } } }, // 将符合条件的属性名提取为数组 { $project: { houseDetails: { $map: { input: { $filter: { input: { $objectToArray: "$houseDetails" }, cond: { $eq: ["$$this.v.flag", true] } } }, in: "$$this.k" } } } } ])
各阶段说明:
$match阶段:
先用$objectToArray把houseDetails对象转成{k: 属性名, v: 属性值}的键值对数组,再用$filter筛选出v.flag为true的元素,最后通过$size判断筛选后的数组长度是否大于0,以此过滤出符合条件的文档。$project阶段:
重复$objectToArray+$filter的操作拿到所有flag为true的键值对,再用$map把每个元素的k(属性名)提取出来,组成新的数组赋值给houseDetails,得到你要的最终格式。
如果你的实际文档里houseDetails还有其他嵌套层级,只需要调整cond里的路径(比如$$this.v.xxx.flag)就能适配。
内容的提问来源于stack exchange,提问作者Zephyr
相关产品推荐
相关产品推荐

