如何更新 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 那么您可以按照上面给出的步骤更改您的分片键
但在进行分片之前,始终选择一个用下划线分隔的良好分片密钥是一个好习惯。
参考资料
需要更新所有文档的一个字段的值。不幸的是,该字段是该集合的分片键。例如集合里面的文档如下,
{
"_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 那么您可以按照上面给出的步骤更改您的分片键
但在进行分片之前,始终选择一个用下划线分隔的良好分片密钥是一个好习惯。
参考资料