2011-04-10 140 views
2

我是新来的MongoDB,并想知道与注册的BsonClassMaps查询域对象。 考虑下面的映射:C#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); }); 

域实体是 “航程”。在这个简单的例子中,它由一个复杂的类型“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。

回答

1

通过上面的类注册,你将有文档这样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标识得到Voyage你应该使用下面的查询:

Query.EQ("_id._id", someStringID) 

注:你不需要BsonClassMap.RegisterClassMap为类,如果你映射所有文件,因为它将被默认序列化,没有任何注册。您也可以使用[BsonId][BsonIgnore]等属性进行自定义序列化。有关更多详细信息,请检查documentation或询问另一个问题;)。

从技术文档:

你可以自己创建这个类地图 或简单地允许类映射 被自动创建时,首先需要 (称为“自动映射”)。通过 您可以 发挥在 自动映射过程或者一些控制与 序列化相关的属性或 使用初始化代码(装饰你的类属性 使用起来非常方便,但对于 那些谁喜欢保持系列化 细节出了自己域类可以 放心,任何可以用属性来完成 也可以做 没有他们)

+0

谢谢你,工作以及促进了我的面向文档DB的理解。所以你说我不需要映射除IdField之外的其他字段? – hoetz 2011-04-10 14:59:36

+0

@Malkier:不,你根本不需要映射。至少在你的例子中。我从文档中添加了一些笔记来解决我的问题。 – 2011-04-10 16:34:21