从遗留 UUID 迁移到标准 UUID
Migrate from legacy UUID to standard UUID
我有一个用于 mongo 的简单迁移框架,它正在执行传入其中的一些脚本。
现在我想将我的 LUUID 迁移到 UUID。我写了以下内容:
function fixIds(collectionName) {
function uuidv4() {
return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
var collection = db.getCollection(collectionName);
var items = collection.find({}).toArray().map(x => Object.assign(x, { _id: UUID(uuidv4()) })); // replace legace UUID with standard UUID
collection.drop();
collection.insertMany(items);
}
fixIds("specialoffers");
那我运行它:
public static async Task<BsonValue> EvalAsync(this IMongoDatabase database, string javascript)
{
var client = database.Client as MongoClient;
if (client == null)
throw new InvalidOperationException("Client is not a MongoClient");
var function = new BsonJavaScript(javascript);
var op = new EvalOperation(database.DatabaseNamespace, function, null);
using (var writeBinding = new WritableServerBinding(client.Cluster, new CoreSessionHandle(new NoCoreSession())))
{
return await op.ExecuteAsync(writeBinding, CancellationToken.None).ConfigureAwait(false);
}
}
它会执行,但会将 LUUID 值替换为其他 LUUID 值。但是,当我 运行 在我的 Robo 3T
shell 中使用这个脚本时,它按预期工作。
这段代码有什么问题?为什么它仅适用于 shell?
这个人为我工作:
function fixIds(collectionName) {
var collection = db.getCollection(collectionName);
var items = collection.find({}).toArray().map(x => Object.assign(x, { _id: new BinData(4, x._id.base64()) })); // replace legacy UUID with standard UUID
collection.drop();
collection.insertMany(items);
}
fixIds("specialoffers");
我用 new BinData(4, x._id.base64()) })
替换了 UUID(uuidv4())
,这是正确更新 UUID 版本的唯一方法。
我有一个用于 mongo 的简单迁移框架,它正在执行传入其中的一些脚本。
现在我想将我的 LUUID 迁移到 UUID。我写了以下内容:
function fixIds(collectionName) {
function uuidv4() {
return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
var collection = db.getCollection(collectionName);
var items = collection.find({}).toArray().map(x => Object.assign(x, { _id: UUID(uuidv4()) })); // replace legace UUID with standard UUID
collection.drop();
collection.insertMany(items);
}
fixIds("specialoffers");
那我运行它:
public static async Task<BsonValue> EvalAsync(this IMongoDatabase database, string javascript)
{
var client = database.Client as MongoClient;
if (client == null)
throw new InvalidOperationException("Client is not a MongoClient");
var function = new BsonJavaScript(javascript);
var op = new EvalOperation(database.DatabaseNamespace, function, null);
using (var writeBinding = new WritableServerBinding(client.Cluster, new CoreSessionHandle(new NoCoreSession())))
{
return await op.ExecuteAsync(writeBinding, CancellationToken.None).ConfigureAwait(false);
}
}
它会执行,但会将 LUUID 值替换为其他 LUUID 值。但是,当我 运行 在我的 Robo 3T
shell 中使用这个脚本时,它按预期工作。
这段代码有什么问题?为什么它仅适用于 shell?
这个人为我工作:
function fixIds(collectionName) {
var collection = db.getCollection(collectionName);
var items = collection.find({}).toArray().map(x => Object.assign(x, { _id: new BinData(4, x._id.base64()) })); // replace legacy UUID with standard UUID
collection.drop();
collection.insertMany(items);
}
fixIds("specialoffers");
我用 new BinData(4, x._id.base64()) })
替换了 UUID(uuidv4())
,这是正确更新 UUID 版本的唯一方法。