C# MongoDB Query with BsonClassMaps
本文关键字:BsonClassMaps with Query MongoDB | 更新日期: 2023-09-27 17:49:53
我是MongoDB的新手,想知道如何查询注册BsonClassMaps的域对象。考虑以下映射:
BsonClassMap.RegisterClassMap<VoyageNumber>(cm =>
{ cm.MapField<string>(p => p.Id); });
BsonClassMap.RegisterClassMap<Schedule>(cm =>
{ cm.MapField<DateTime>(p => p.EndDate); cm.MapField<DateTime>(p => p.StartDate); });
BsonClassMap.RegisterClassMap<Voyage>(cm =>
{ cm.MapIdField<VoyageNumber>(p => p.VoyageNumber); cm.MapField<Schedule>(p => p.Schedule); });
域实体为"Voyage"。在这个简单的示例中,它由复杂类型"Schedule"(具有开始日期和结束日期)和VoyageNumber(具有字符串id字段)组成。"VoyageNumber"是实体的标识符。
现在我可以插入一个新的航程:
MongoCollection<Voyage> mongoVoyages = context.MyDB.GetCollection<Voyage>("Voyages");
mongoVoyages.Insert<Voyage>(voyage);
我可以检索一个航行通过:
MongoCollection mongoVoyages = context.MyDB.GetCollection("Voyages");
BsonDocument result = mongoVoyages.FindOneAs<BsonDocument>();
BsonDocument sched = result["Schedule"].AsBsonDocument;
DateTime start = sched["StartDate"].AsDateTime;
//etc...
现在我当然想通过Id搜索航行。如何使用上面所示的映射实现这一点?我尝试了如下操作,但失败了:
Query.EQ("VoyageNumber", someStringID)
我使用的是官方的c#驱动1.0。
通过以上类注册,您将在mongodb中拥有这样的文档:
{
"_id": {
"_id": someStringID
},
"Schedule": {
"EndDate": "Sun, 10 Apr 2011 13:06:25 GMT +03:00",
"StartDate": "Sun, 10 Apr 2011 13:06:25 GMT +03:00"
}
}
因此,如果您想通过VoyageNumber
Id获取Voyage
,您应该使用以下查询:
Query.EQ("_id._id", someStringID)
注:你不需要BsonClassMap.RegisterClassMap
类,如果你映射所有的文件,因为它将默认序列化没有任何注册。还可以使用[BsonId]
、[BsonIgnore]
等属性进行自定义序列化。要了解更多详细信息,请查看文档或询问其他问题;)。
您可以创建这个类映射您自己或仅仅允许类映射首次创建时自动创建需要(称为"自动映射")。你可以对……施加一些控制自动映射过程装饰你的课堂序列化相关属性或由使用初始化代码(属性)使用起来很方便,但是那些喜欢保持序列化的人从它们的域类中获取详细信息确信任何事情都可以做到用属性也可以做到没有他们)