使用带有注册类映射的 MongoDB 驱动程序通过 GUID 查找对象

问题描述 投票:0回答:1

如何通过GUID查找mongo文档? c# POCO 有一个 Id 属性,存储在 mongo 数据库中。

POCO 的类映射在配置客户端之前注册并调用:

BsonClassMap.RegisterClassMap<MyClass>(cm =>
{
    cm.AutoMap();
    cm.MapIdProperty(m => m.MyId)
        .SetSerializer(new GuidSerializer(GuidRepresentation.Standard));
});

现在,从外观上看,文档已正确存储在数据库中:

但是,使用构建器检索文档不会产生任何结果:

Guid myGuidId = ...;
var filterBuilder = Builders<MyClass>.Filter;
var filter = filterBuilder.Eq(d => d.MyId, myGuidId);
return Collection.Find(filter).FirstOrDefaultAsync();

奇怪的是,当从一开始执行以下任一操作时,此查询都会检索文档:

  • 序列化为字符串
    cm.MapIdProperty(m => m.SimulationId).SetSerializer(new GuidSerializer(BsonType.String))
  • 使用过时的全局声明进行 GUID 序列化
    BsonDefaults.GuidRepresentation = GuidRepresentation.Standard
c# .net mongodb guid
1个回答
0
投票

此行为与默认配置的 GUID 表示模式 (V2) 有关。您可以在here或在我的回答here

中阅读有关此内容的内容

要使用您的代码,请执行以下操作:

        BsonClassMap.RegisterClassMap<MyClass>(cm =>
        {
            cm.AutoMap();
            cm.MapIdProperty(m => m.Value)
                .SetSerializer(new GuidSerializer(GuidRepresentation.Standard));
        });

        var value = Guid.NewGuid();
        var filterBuilder = Builders<MyClass>.Filter;
        var filter = filterBuilder.Eq(d => d.Value, value);

        // Option 1
        var coll = new MongoClient().GetDatabase("d").GetCollection<MyClass>("coll", new MongoCollectionSettings { GuidRepresentation = GuidRepresentation.Standard });
        coll.DeleteMany("{}");
        coll.InsertOne(new MyClass() { Value = value });

        var result = coll.Find(filter).ToList(); // one record returned
        Console.WriteLine(result.Count);

        // Option 2
        BsonDefaults.GuidRepresentationMode = GuidRepresentationMode.V3;

        coll = new MongoClient().GetDatabase("d").GetCollection<MyClass>("coll");
        coll.DeleteMany("{}");
        coll.InsertOne(new MyClass() { Value = value });
        result = coll.Find(filter).ToList();  // one record returned
        Console.WriteLine(result.Count);
© www.soinside.com 2019 - 2024. All rights reserved.