如何通过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))
BsonDefaults.GuidRepresentation = GuidRepresentation.Standard
此行为与默认配置的 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);