【问题标题】:How to update shard key of mongodb collection如何更新 mongodb 集合的分片键
【发布时间】:2020-01-16 06:32:32
【问题描述】:

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

{
    "_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 的 MongoDB API

【问题讨论】:

  • 在 MongoDB 中,shard key field and values are immutable。这意味着无法更改分片键字段,并且无法更改每个文档的分片键值。我不知道 Azure Cosmos DB's API for MongoDB 的这种行为;请参考相应的文档。

标签: azure-cosmosdb-mongoapi


【解决方案1】:

只能更改分片键

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

要更改 Shard Key,您需要按照以下步骤操作

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

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

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

但在进行分片之前,始终选择一个用下划线分隔的好的 Sharding Key 是一种很好的做法。

参考资料

Shard Keys

Sharding FAQ's

【讨论】:

    猜你喜欢
    • 2021-07-14
    • 1970-01-01
    • 2011-04-27
    • 2019-04-25
    • 1970-01-01
    • 2013-08-31
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多