2011-08-07 13 views
6

Mongoの既存のドキュメントに複雑な型を追加しようとすると問題が発生します。複雑なクラスをMongoに追加する

私は以下の2つのクラスを持っています。

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":{ "データ":12、 "DATA2":123、 "DATA3":{ "_t": "ComplexClass" 、 "Bar": "bar"、 "Foo":1234} }}

文書が正しく挿入されます。次に、値の1つを変更します。

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); 

ドキュメントはデータベースに表示されます。

{"データ":12、 "データ2":{"バー": "FooBar"、 "Foo":-1234}、 "data3":{"_t": "ComplexClass" "BooData"(3、 "W11Jy + hYqE2nVfrBdxn54g =="))

このレコードを取得しようとすると、FileFormatExceptionが返されます。

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

(未処理の例外:System.IO.FileFormatException:逆シリアル化オブジェクトの実際のT YPEを決定することができないNominalTypeはSystem.ObjectのとBsonTypeがDocum ENTです。)。

data3とは異なり、data2にはディスクリミネータはありません。私は何をやっている?

答えて

4

さて、ドライバーが弁別をしたい場合は、更新内のオブジェクトへのあなたのクラスをキャストすることによって、それを与えることができます。

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

これはあなたの問題を解決します。

ところで、あなたの更新が実際にUserObjects内DATA2フィールドを更新しない、それが正常に動作するはずのコードを次のように、文書内の新しいデータ2フィールドを作成:

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

デシリアライザは、Bson表現に基づいて使用する必要があるタイプを自ら把握できません。数日前に私の質問を見てください。私はそれがいくつかを明確にすると思う。 BsonSerializableを実装すると、問題が解決されます。

Storing composite/nested object graph

関連する問題