对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

设置缺失分片键字段

分片键字段缺失的文档与分片键字段值为 null 的文档同属一个数据块范围。例如,如果分片键位于字段{ x: 1, y: 1 }上,则:

缺少分片键的文档
属于与以下项目相同的范围

{ x: "hello" }

{ x: "hello", y: null }

{ y: "goodbye" }

{ x: null, y: "goodbye" }

{ z: "oops" }

{ x: null, y: null }

要定位分片键字段缺失的文档,可以对分片键字段使用{ $exists: false }过滤条件。例如,如果分片键位于字段{ x: 1, y: 1 }上,则可以通过运行以下查询找到分片键字段缺失的文档:

db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )

如果指定了 null 值相等匹配过滤条件(例如 { x: null }),筛选器会匹配那些缺少分片键字段的文档,会匹配那些分片键字段被设置为 null 的文档。

某些写入操作(例如使用upsert规范的写入)需要对分片键进行等值匹配。在这些情况下,要定位缺少分片键的文档,除了与null的等值匹配之外,还应包含另一个过滤条件。例如:

{ _id: <value>, <shardkeyfield>: null } // _id of the document missing shard key

如果缺少分分片键字段,可以设立分分片键字段设置为null 。 如果要将缺失的分分片键字段设立为非null值,请参阅更改文档的分片键值。

要执行更新,您可以在 mongos 上使用以下操作:

命令
方法
说明

使用 更新
multi: true

  • 仅用于将缺失的键值设置为 null

  • 可以在事务内部或外部执行。

  • 是否可以作为可重试写入来执行。

  • 有关其他要求,请参阅特定命令/方法。

使用 更新
multi: false

  • 可用于将缺失的键值设置为 null 或任何其他值。

  • 设置缺失的分片键字段的更新必须满足以下要求之一:

    • 查询的过滤器包含查询中完整分片键的相等条件

    • 查询的过滤器包含与 _id 完全匹配的项

    • 更新针对单个分片

  • 要设置为非 null 值,请参阅更改文档的分片键值

  • 有关其他要求,请参阅特定命令/方法。

  • 可用于将缺失的键值设置为 null 或任何其他值。

  • 当使用只显式更新一个文档的方法设置缺失的分片键字段时,更新必须满足以下要求之一:

    • 查询的过滤器包含查询中完整分片键的相等条件

    • 查询的过滤器包含与 _id 完全匹配的项

    • 更新针对单个分片

  • 当使用 null 作为匹配条件时,会返回缺失的键值。为避免更新为 null 的键值,请酌情纳入其他查询条件。

  • 要设置为非 null 值,请参阅更改文档的分片键值

  • 有关其他要求,请参阅特定命令/方法。

  • 要设置为null值,您可以在批量操作中指定多个分片键修改。

  • 当使用只显式更新一个文档的方法设置缺失的分片键字段时,更新必须满足以下要求之一:

    • 查询的过滤器包含查询中完整分片键的相等条件

    • 查询的过滤器包含与 _id 完全匹配的项

    • 更新针对单个分片

  • 要设置为非 null 值,请参阅更改文档的分片键值

  • 有关其他要求,请参阅底层命令/方法。

考虑在 location 字段上分片的 sales 集合。集合中的某些文档没有 location 字段。缺失字段被视为与该字段的 null 值相同。要明确将这些字段设置为 null,请运行以下命令:

db.sales.updateOne(
{ _id: 12345, location: null },
{ $set: { location: null } }
)

使用 db.collection.updateOne() 或其他仅显式更新一个文档的方法设置缺失的分片键字段时,更新必须满足以下要求之一:

  • 查询的过滤器包含查询中完整分片键的相等条件

  • 查询的过滤器包含与 _id 完全匹配的项

  • 更新针对单个分片