5

次のコードを使用して、MongoDB にオブジェクトを永続化しようとしています。

public class myClass
{
    public string Heading { get; set; }
    public string Body { get; set; } 
}

static void Main(string[] args)
{
    var mongo = MongoServer.Create();
    var db = mongo.GetDatabase("myDb");
    var col = db.GetCollection<BsonDocument>("myCollection");
    var myinstance = new myClass();
    col.Insert(myinstance);

    var query = Query.And(Query.EQ("_id", new ObjectId("4df06c23f0e7e51f087611f7)));
    var res = col.Find(query);
    foreach (var doc in res)
    {
        var obj = BsonSerializer.Deserialize<myClass>(doc);
    }
}

ただし、ドキュメントを逆シリアル化しようとすると、「予期しない要素: _id」という例外が発生します。

別の方法でデシリアライズする必要がありますか?? これを行うための好ましい方法は何ですか?

ティア

セーレン

4

3 に答える 3

3

Projapatiの答えのわずかなバリエーション。まず、Mongo は id 値を、Idより chsarp っぽいという名前のプロパティに喜んでデシリアライズします。ただし、データを取得するだけの場合は、必ずしもこれを行う必要はありません。

[BsonIgnoreExtraElements]あなたのクラスに追加することができ、それはうまくいくはずです。これにより、クエリやビューモデルに最適なデータのサブセットを返すことができます。

于 2011-10-07T15:31:23.473 に答える
3

ObjectId を使用して特定のドキュメントを検索していますが、MyClass のインスタンスを保存するときに Id プロパティを提供していないため、ドライバーが作成します ([BsonId] 属性を追加することで、任意のプロパティを ID にすることができますそのドキュメントを取得すると、ID がないため、逆シリアル化エラーが発生します。

Chris が言ったように、BsonIgnorExtraElements 属性をクラスに追加できますが、ObjectId 型の Id プロパティをクラスに追加する必要があります。明らかに Id が必要です (クエリで使用しているため)。_id プロパティは主キー用に予約されているため、取得するドキュメントは 1 つだけなので、次のようにクエリを記述したほうがよいでしょう。

col.FindOneById(new ObjectId("4df06c23f0e7e51f087611f7"));

ドキュメントを取得したら MyClass のインスタンスに逆シリアル化するという事実は、コレクションの厳密な型指定に役立つため、コレクションのインスタンスを作成する場所でこれを行うことができます

var col = db.GetCollection<MyClass>("myCollection");

FindOneById メソッドを使用してドキュメントを取得すると、ドライバがデシリアライズを処理してすべてをまとめるようにします (クラスに Id プロパティを追加する場合)。

var col = db.GetCollection<MyClass>("myCollection");
MyClass myClass = col.FindOneById(new ObjectId("4df06c23f0e7e51f087611f7"));

_id プロパティはドライバーによって保存時に作成されるため、MyClass インスタンスから除外すると、そのドキュメントを保存するたびに新しい ID が取得され、新しいドキュメントが作成されます。 n 回保存すると、n 個のドキュメントが作成されますが、これはおそらく望んでいないことです。

于 2011-11-23T21:41:54.773 に答える
0

クラスに _id を追加してみてください。これは通常、ドキュメント内のすべてのフィールドのメンバーがクラスにない場合に発生します。

public class myClass
{
    public ObjectId _id { get; set; }
    public string Heading { get; set; }
    public string Body { get; set; } 
}
于 2011-07-06T00:28:04.000 に答える