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

pm1*_*100 30 c# poco mongodb

如果我想用POCO读写mongo数据

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

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

Chr*_*tow 61

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

您只需要Id在POCO中添加一个属性,该属性将从以下位置反序列化_id:

public class Thingy
{
     public ObjectId Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

[BsonId]
public ObjectId MyKey { get; set; }   
Run Code Online (Sandbox Code Playgroud)

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

  • +1的最终解释是_id可以设置为任何数据类型的任何值(数组除外).关于这一点,我对官方文档感到有些困惑 (5认同)
  • [脏话][脏话][脏话],和这个吵了2天了。感谢@Chris Fulstow,这是一个不起眼但关键的功能! (2认同)
  • 强调_id 字段不必是 MongoDB ObjectId_。如果您使用 ObjectId 或 Bson 属性,那么您的对象不再是 POCO(普通的旧 CLR 对象),所以实际上,这就是答案。如果可以的话,避免使用它们。 (2认同)

小智 10

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

[BsonId(IdGenerator = typeof(ObjectIdGenerator))]
public object ThingyId { get; set; }
Run Code Online (Sandbox Code Playgroud)

MongoDb Driver中有3种可用,您也可以自己编写.更多信息,请访问http://www.mongodb.org/display/DOCS/CSharp+Driver+Serialization+Tutorial#CSharpDriverSerializationTutorial-WriteacustomIdgenerator


小智 6

我通常包装 Thingy:

public class MongoThingy
{
    public ObjectId Id { get; set; }
    public Thingy Thingy { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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