数据块范围与缺失的分片键字段
缺失的分片键字段与具有 null 值的分片键属于同一数据块范围。示例,如果分片键位于字段 { x:
1, y: 1 } 上,则:
缺少分片键的文档 | 属于与以下项目相同的范围 |
|---|---|
|
|
|
|
|
|
读/写操作与缺失的分片键字段
要定位缺少分片键字段的 document,可以对分片键字段使用 { $exists: false } 过滤条件。示例,如果分片键位于字段 { x: 1, y: 1
} 上,则可以通过运行以下查询来查找缺少分片键字段的document:
db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
如果指定了空值相等匹配过滤条件(例如{ x: null
} ),过滤器会匹配 缺少分片键字段的文档和分片键字段设置为 null 的文档。
某些写入操作(例如使用upsert规范的写入)需要对分片键进行等值匹配。在这些情况下,要定位缺少分片键的文档,除了与null的等值匹配之外,还应包含另一个过滤条件。例如:
{ _id: <value>, <shardkeyfield>: null } // _id of the document missing shard key
设置缺失的分片键字段
如果缺少分分片键字段,可以设立分分片键字段设置为null 。 如果要将缺失的分分片键字段设立为非null值,请参阅更改文档的分片键值。
要执行更新,您可以在 mongos 上使用以下操作:
命令 | 方法 | 说明 |
|---|---|---|
update with multi: true |
| |
update with multi: false |
| |
| ||
|
例子
考虑在 location 字段上分片的 sales 集合。集合中的某些文档没有 location 字段。缺失字段被视为与该字段的 null 值相同。要明确将这些字段设置为 null,请运行以下命令:
db.sales.updateOne( { _id: 12345, location: null }, { $set: { location: null } } )
使用 db.collection.updateOne() 或其他仅显式更新一个文档的方法设置缺失的分片键字段时,更新必须满足以下要求之一:
查询的过滤器包含查询中完整分片键的相等条件
查询的过滤器包含与 _id 完全匹配的项
更新针对单个分片