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 値に設定します。
Id
プロパティをPOCOに追加するだけで、_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
に自動的に変換します。
public class Thingy
{
public ObjectId Id { get; set; }
public string Foo { get; set; }
}
クラスによる
必要な場合は、次のコードを使用します。
var collection = database.GetCollection<Thingy>("db_Thingy");
Thingy tg= new Thingy();
tg.Foo = "Hello";
collection.insert(tg);