点号路径的作用
点号是 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,否则会查出并不符合业务预期的文档。