MongoDB能否将空字符串识别为属性名?该如何查询对应嵌套字段?
解决方案
MongoDB 原生的点查询语法不支持直接引用空字符串作为字段名,你之前的两种写法要么不符合语法规则触发报错,要么无法正确匹配到字段返回空结果。
可以使用聚合管道配合$getField操作符实现查询需求,$getField支持传入空字符串作为字段名提取对应值,和你原本distinct需求等价的查询语句如下:
db.isover_projects.aggregate([ // 提取vnut_okraj_podmienky下空字符串键对应的对象 { $project: { empty_key_data: { $getField: { field: "", input: "$vnut_okraj_podmienky" } } } }, // 提取目标字段值 { $project: { target_value: "$empty_key_data.nestand_teplota.value", _id: 0 } }, // 对值去重,和distinct效果一致 { $group: { _id: "$target_value" } } ])
返回结果中的_id字段就是去重后的目标字段值。
如果你需要查询对应值等于24的文档,也可以用$expr配合$getField实现:
db.isover_projects.find({ $expr: { $eq: [ { $getField: { field: "value", input: { $getField: { field: "nestand_teplota", input: { $getField: { field: "", input: "$vnut_okraj_podmienky" } } } } }, "24" ] } })
如果你使用的是MongoDB 5.0以下的版本,不支持
$getField操作符,可以用$objectToArray转对象为数组后过滤查询,写法如下:
db.isover_projects.aggregate([ { $project: { vnut_arr: { $objectToArray: "$vnut_okraj_podmienky" } } }, { $unwind: "$vnut_arr" }, // 匹配键名为空字符串的项 { $match: { "vnut_arr.k": "" } }, // 提取目标值去重 { $group: { _id: "$vnut_arr.v.nestand_teplota.value" } } ])
内容的提问来源于stack exchange,提问作者supipd
相关产品推荐
相关产品推荐

