MongoDB如何使用字段名通配符筛选嵌套字段符合条件的文档
MongoDB 通配符子字段查询方案
MongoDB 原生查询语法不支持fieldC.*.N这类直接写在路径里的通配符匹配,你可以用下面的方法实现筛选fieldC下任意子字段满足N>0的文档:
通用聚合查询方案(所有MongoDB版本可用)
核心思路是用$objectToArray运算符把未知键名的子对象转成键值对数组,再做条件判断,不需要提前知道fieldC下的子字段命名,查询示例:
// 替换yourCollectionName为你的实际集合名 db.yourCollectionName.aggregate([ { $match: { $expr: { $anyElementTrue: { $map: { input: { $objectToArray: "$fieldC" }, in: { $gt: ["$$this.v.N", 0] } } } } } } ])
逻辑拆解:
$objectToArray: "$fieldC"会把fieldC的子字段转换为固定结构的数组,比如你给的示例文档会被转成:[ {"k": "fieldX1", "v": {"N": 2}}, {"k": "fieldX2", "v": {"N": 1}}, {"k": "fieldX3", "v": {"N": 3}} ]$map遍历数组里的每一项,判断对应子字段的N值是否大于0$anyElementTrue只要遍历结果里有一个为true,就判定当前文档匹配查询条件
大数据量性能优化
如果你的集合数据量较大,为了避免全表扫描,可以提前创建通配符索引覆盖查询字段,创建命令:
db.yourCollectionName.createIndex({ "fieldC.$**.N": 1 })
创建后上面的聚合查询可以直接命中索引,查询速度和普通精确字段查询基本一致。
提示:如果
fieldC下部分子字段不存在N字段,上述查询会自动跳过这类字段,不会抛出语法错误。
内容的提问来源于stack exchange,提问作者Rahome
相关产品推荐
相关产品推荐

