web-dev-qa-db-ja.com

mongodb c#ドライバーでPOCOを使用するときに_idフィールドを管理する方法

POCOでmongoデータを読み書きしたい場合

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

読み返すと、_idが予期しない属性であるというエラーが表示されます(これはそうです)。それで、_idというフィールドをクラスに追加しました。これで、挿入は機能せず、_idフィールドをnullにすることはできません。試したBsonIgnoreIfNull属性。これは機能しませんでした。

31
pm100

オブジェクトを挿入するときに、_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である必要はありません。任意のデータ型の任意の値(配列を除く)に設定できます。コレクション内で一意である必要があります。

58
Chris Fulstow

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

9
Wojtek

私は通常、Thingyをラップします。

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

Thingyクラスは、私が制御できない別のライブラリから取得されることがよくあるので、それは非常に簡単になります。また、処理のために他の人に渡すために、逆シリアル化するのも簡単です。

2
Ravi J

次のようにプロパティを追加します。

public BsonObjectId Id { get; set; }

MongoDBドライバーは、シリアライゼーション\デシリアライズ中にId_idに自動的に変換します。

1
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);
1
Ali Eshghi