首页/数据/NoSQL 速查/点号路径查询嵌套字段
MongoDB99 条

点号路径查询嵌套字段

嵌套对象与数组用点号定位:"addr.city" 匹配子文档字段,"items.sku" 匹配数组中任一元素的 sku。

NoSQL 速查数据更新于 2026-10-13

点号路径的作用

点号是 MongoDB 访问嵌套结构字段的路径语法:字符串 "addr.city" 表示子文档 addr 下的 city 字段,"items.sku" 表示数组 items 中任一元素的 sku 字段。查询、更新、投影与聚合表达式共用这套写法,路径区分大小写,层级写错不会报错,只会静默返回空结果。

基本信息

子文档字段"addr.city": "Shanghai"
数组元素字段"items.sku": "A-1",任一元素命中即匹配
数组下标"items.0.sku",按下标定位第一条元素
大小写路径与字段名完全区分大小写
适用范围查询条件、$set 更新、投影、聚合表达式通用

典型使用场景

  • 查询嵌套地址、配置类子文档字段,避免为少量维度拆表
  • 在订单明细数组里按商品编号反查所属订单
  • 用 $set 只更新子文档或数组中某个具体元素
  • 投影时只返回嵌套结构中需要的少量字段
  • 聚合表达式中引用嵌套字段参与计算与分组

常用写法

常用写法
// 子文档字段查询
 db.users.find({ "addr.city": "Shanghai" })

// 数组元素字段:任一元素的 sku 等于 A-1 即命中
 db.orders.find({ "items.sku": "A-1" })

// 按下标定位数组中第一条元素
 db.orders.find({ "items.0.sku": "A-1" })

// 只更新数组中第一个匹配到的元素,$ 是位置占位符
 db.orders.updateOne({ _id: 1001, "items.sku": "A-1" }, { $set: { "items.$.qty": 3 } })

// 投影只保留嵌套字段,保留式与排除式写法不能混用
 db.users.find({ "addr.city": "Shanghai" }, { "addr.city": 1, _id: 0 })

写法与语义

写法语义常见误用
"a.b": v子文档 a 的字段 b 等于 v误以为会匹配整个子文档对象
"arr.x": v数组 arr 中任一元素的 x 等于 v当成同一元素内的组合条件
"arr.0.x": v数组第一条元素的 x 等于 v下标越界时静默无匹配
{ "arr.x": v1, "arr.y": v2 }两个条件可由不同元素分别满足要求同一元素时须改用 $elemMatch
数组字段配点号时,多个条件之间是「某个元素满足即可」,不是「同一条元素同时满足」。要求同一元素满足多个条件必须使用 $elemMatch,否则会查出并不符合业务预期的文档。

易错点

  • 把数组上的多个点号条件当成组合条件,会匹配到 x 由一个元素满足、y 由另一个元素满足的文档,统计口径直接出错
  • 字段名本身含点号或空格时点号路径会产生歧义,建模阶段就该避开特殊字符,遗留数据只能改用聚合表达式处理
  • 路径大小写写错不会报错,只会静默返回空结果,排查时容易误判为数据不存在
  • 更新嵌套数组元素时用错占位符,$ 只作用于第一个匹配元素,批量修改需要改用 arrayFilters 指定条件

数据来源与参考

  • MongoDB Manual: Dot Notation
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌