使用POCO和mongodb c#驱动程序时如何管理_id字段

如果我想用POCO读写mongo数据

public class Thingy { public string Foo {get;set;} } ... coll.Insert(new Thing(Foo = "hello")); 

当我回读时,我得到一个失败,说_id是一个意外的属性(它是)。 然后我在课堂上添加了一个名为_id的字段。 现在插入不起作用,说_id字段不能为null。 一个尝试过的BsonIgnoreIfNull属性,它没有用。

插入对象时,如果它没有_id字段,则驱动程序会添加一个并将其设置为12字节的MongoDB ObjectId值。

您只需要向POCO添加Id属性,该属性将从_id反序列化:

 public class Thingy { public ObjectId Id { get; set; } } 

或者,如果您想委托另一个属性映射到_id那么您可以使用BsonIdAttribute来装饰它,如下所示:

 [BsonId] public ObjectId MyKey { get; set; } 

_id字段不必是MongoDB ObjectId ,您可以将其设置为任何数据类型的任何值(数组除外),它只需要在集合中是唯一的。

您必须为id添加属性(或字段)并告诉序列化程序您要使用哪个id生成器。

 [BsonId(IdGenerator = typeof(ObjectIdGenerator))] public object ThingyId { get; set; } 

MongoDb驱动程序中有3个可用,或者您可以编写自己的驱动程序。 更多信息, 请访问http://www.mongodb.org/display/DOCS/CSharp+Driver+Serialization+Tutorial#CSharpDriverSerializationTutorial-WriteacustomIdgenerator

我一般包裹着Thingy:

 public class MongoThingy { public ObjectId Id { get; set; } public Thingy Thingy { get; set; } } 

这使得它变得更容易,因为Thingy类通常来自一个我无法控制的不同库。 反序列化也更容易,以便将其移交给其他人进行处理。

添加属性如下:

 public BsonObjectId Id { get; set; } 

MongoDB驱动程序在序列化\ _id期间自动将Id转换为_id

 public class Thingy { public ObjectId Id { get; set; } public string Foo { get; set; } } 

根据上课

如果需要,请使用以下代码:

 var collection = database.GetCollection("db_Thingy"); Thingy tg= new Thingy(); tg.Foo = "Hello"; collection.insert(tg);