You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 22:55:16