MongoDB投影对含数字的嵌套属性失效,求修复方案
MongoDB嵌套含数字键投影失败问题解决
问题场景
原始文档结构
{ "_id": "some_id", "temp_f": 65.8, "current_observation": { "rain_day_in": 0, "soil_moisture_1": 0, "soil_moisture_1_day_high": 0 }, "date": "12/23/2021", "date_and_time": "2021-12-23T20:34:21", ... 其他更多属性 }
执行的查询命令
db.getCollection('weather').find({}, { "temp_f": 1, "rain_day_in": "$current_observation.rain_day_in", "soil_moisture_1": "$current_observation.soil_moisture_1", "soil_moisture_1_day_high": "$current_observation.soil_moisture_1_day_high", "date": 1, "_id": 0 }).sort({ date_and_time: -1 }).limit(1);
返回结果
[ { "temp_f": 66.6, "date": "03/12/2025", "rain_day_in": 0 } ]
问题
结果中未返回带有数字的嵌套属性soil_moisture_1和soil_moisture_1_day_high,其他含数字的嵌套属性也存在同样问题。是否是数字导致的问题?如何修改命令以获取这些属性?使用MongoDB版本为v7.0.15。
解答
问题原因
不是键名中的数字导致的问题。核心原因是:你在find()方法的投影参数中使用了聚合风格的字段映射语法(即带$的嵌套字段引用),但find()的投影功能仅有限支持这种语法,对于嵌套字段的展平/重命名,这种写法并不稳定,会出现部分字段无法正常投影的情况。
修改方案
改用聚合管道实现查询,利用$project阶段完全支持聚合式字段映射语法,稳定实现嵌套字段的展平:
db.getCollection('weather').aggregate([ // 先排序取最新文档 { $sort: { date_and_time: -1 } }, { $limit: 1 }, // 投影展平字段 { $project: { temp_f: 1, rain_day_in: "$current_observation.rain_day_in", soil_moisture_1: "$current_observation.soil_moisture_1", soil_moisture_1_day_high: "$current_observation.soil_moisture_1_day_high", date: 1, _id: 0 } } ])
补充说明
聚合管道的$project阶段专门用于处理字段的投影、重命名和计算,完全支持嵌套字段的引用,不会出现find()投影中的兼容性问题。同时,先执行$sort和$limit再做$project,也能保证查询的性能最优。
内容的提问来源于stack exchange,提问作者Miguel
相关产品推荐
相关产品推荐

