将复杂类添加到Mongo

时间:2011-08-07 11:08:42

标签: mongodb mongodb-.net-driver

我在尝试将复杂类型添加到Mongo中的现有文档时遇到了麻烦。

我有以下两个班级。

public class UserObjectCollection {

    [BsonId]
    public Guid UserId { get; set; }

    public Dictionary<string, object> UserObjects { get; set; }

    public UserObjectCollection() {
        UserObjects = new Dictionary<string, object>();
    }
}

public class ComplexClass {
    public string Bar { get; set; }
    public int Foo { get; set; }
}

然后我创建了一个新的插入对象。

var bd = new UserObjectCollection() {
    UserId = Guid.NewGuid(),
    UserObjects = {
        { "data", 12 },
        { "data2", 123 },
        { "data3", new ComplexClass() { Bar= "bar", Foo=1234 } }
    }
};

插入文件。

mongoCollection.Insert(bd.ToBsonDocument());

我得到了结果文件。

{“_ id”:BinData(3,“t089M1E1j0OFVS3YVuEDwg ==”),“UserObjects”:{“data”:12, “data2”:123,“data3”:{“_ t”:“ComplexClass”,“Bar”:“bar”,“Foo”:1234} }}

文档正确插入。然后我修改其中一个值。

var query = Query.EQ("UserObjects.data", BsonValue.Create(12));

collection.FindAndModify(
  query, 
  SortBy.Null, 
  Update.SetWrapped<ComplexClass>("data2", new ComplexClass() { Foo = -1234, Bar = "FooBar" }),
  returnNew: false, 
  upsert: true);

数据库中显示的文档。

{“UserObjects”:{“data”:12,“data2”:{“Bar”:“FooBar”,“Foo”: - 1234}, “data3”:{“_ t”:“ComplexClass”,“Bar”:“bar”,“Foo”:1234}},“_ id”:BinData(3,“W11Jy + hYqE2nVfrBdxn54g ==”)}

如果我尝试检索此记录,则会收到FileFormatException。

var theDocument = collection.Find(query).First();

(未处理的异常:System.IO.FileFormatException:无法确定实际t 对象的ype反序列化。 NominalType是System.Object,BsonType是Docum ENT)。

与data3不同,data2没有鉴别器。我在做什么?

2 个答案:

答案 0 :(得分:4)

好的,如果司机想要使用鉴别器,你可以通过在更新中将你的类转换为对象来提供它:

(object)(new ComplexClass() { Foo = -1234, Bar = "FooBar" })

这将解决您的问题。

顺便说一句,您的更新实际上没有更新UserObjects中的data2字段,它在文档中创建新的data2字段,以下代码应该可以正常工作:

 Update.SetWrapped<ComplexClass>("UserObjects.data2", 
                       new ComplexClass() { Foo = -1234, Bar = "FooBar" }),

答案 1 :(得分:2)

Deserializer无法根据Bson表示自己找出它应该使用的类型。几天前看看我的问题。我认为它澄清了一些事情。实现BsonSerializable将解决问题。

Storing composite/nested object graph