C# 从遗留UUID迁移到标准UUID

C# 从遗留UUID迁移到标准UUID,c#,.net,mongodb,mongodb-.net-driver,C#,.net,Mongodb,Mongodb .net Driver,我为mongo提供了一个简单的迁移框架,它正在执行其中传递的一些脚本 现在我想将LUUID迁移到UUID。我写道: function fixIds(collectionName) { function uuidv4() { return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = Math.random() * 16 | 0, v = c ==

我为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);
    }
}
publicstaticasync任务EvalAsync(这是一个数据库,字符串javascript)
{
var client=database.client作为MongoClient;
if(客户端==null)
抛出新的InvalidOperationException(“客户端不是MongoClient”);
var函数=新的BsonJavaScript(javascript);
var op=new EvalOperation(database.DatabaseNamespace,函数,null);
使用(var writebind=new writeableserverbinding(client.Cluster,new CoreSessionHandle(new NoCoreSession()))
{
返回wait op.ExecuteAsync(writeBinding,CancellationToken.None);
}
}
它执行,但将LUUID值替换为其他LUUID值。然而,当我在我的
robo3t
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");

我将
UUID(uuidv4())
替换为
newbindata(4,x.\u id.base64())}
,这是正确更新UUID版本的唯一方法。

我也遇到了同样的情况,因此我感谢您发布您的解决方案。我明天就试试看:)@Tomas很高兴听到这个消息。我浪费了很多时间才弄明白到底是怎么回事,所以我希望这也能帮你省点钱:)