如何更新 mongodb 集合的分片键

How to update shard key of mongodb collection

需要更新所有文档的一个字段的值。不幸的是,该字段是该集合的分片键。例如集合里面的文档如下,

{
    "_id" : ObjectId("5c0763afaabfc3000eb44cc0ss"),
    "sensorId" : "someid",
    "liftId" : "some-lift-id", //Shared key
    "startTimestamp" : NumberLong(1543988140912),
    "endTimestamp" : NumberLong(0),
    "value" : {}
}

我想在所有文档中将 liftId 的值更新为新值(新值 >> prefix-some-lift-id)。

这是我试过的,

db.getCollection('lift_events').find({}).forEach(
    function (elem) {
        db.getCollection('lift_events').update(
            {
                _id: elem._id
            },
            {
                $set: {
                    liftId: 'prefix-' + elem.liftId 
                }
            }
        );
    }
);

但这失败了,因为 liftId 是集合的分片键。有没有办法在不指定分片键的情况下对所有分片实现这一点?

db.version() : 3.4.6 这是 Azure Cosmos DB 的 API for MongoDB

只能更改分片键

  • 如果您使用的是 MongoDB 版本 4.2
  • 分片键不是文档的唯一键_id

To change the Shard Key you need to follow the below steps

MongoDB 不支持在对集合进行分片后选择不同的分片键。这一现实强调了选择一个好的分片键的重要性。如果在对集合进行分片后必须更改分片键,最好的选择是:

  • 将 MongoDB 中的所有数据转储为外部格式。
  • 删除原始分片集合。
  • 使用更理想的分片键配置分片。
  • 预先拆分分片键范围以确保初始均匀分布。
  • 将转储的数据恢复到MongoDB。

在这种情况下 "liftId" : "some-lift-id" 不是唯一键 _id 如果您使用的是 MongoDB 版本 4.2 那么您可以按照上面给出的步骤更改您的分片键

但在进行分片之前,始终选择一个用下划线分隔的良好分片密钥是一个好习惯。

参考资料

Shard Keys

Sharding FAQ's