1

私はC#で次のようなクラスを持っています:

public class MyEntry
{
    public ObjectId Id { get; set; }
    public string SimpleHash { get; set; }
    public string GroupIdentifier { get; set; }
}

これをmongoに保存すると、正常に機能します。ここで、このドキュメントにいくつかのサブドキュメントを追加したいと思います。サブドキュメントのクラスは次のようになります。

public class Detail
{
    public DateTime CreateDate { get; set; }
    public string DetailHash { get; set; }
}

次のように、Pushコマンドを使用してこれらの詳細をルートドキュメントに追加します。

collection.Update(query, Update.PushWrapped("Details", detail));

これは今のところうまく機能しており、MyEntryすべてを添付せずに読む可能性があり、Detailsすべて/最初/最後/Details好きな方を読むことができます。しかし、今の私の問題は、で何かを変更してMyEntry保存すると、Details-Arrayが完全に削除されることです。
更新時に、クラスで言及されていないフィールドをそのままにしておく方法はありますか?

4

1 に答える 1

1

の場合と同じように、更新を使用する必要がありますDetail。C#クラス全体のMongoDBコレクションへのネイティブシリアル化を使用する場合は、これまで見てきたようにドキュメント全体を上書きします。

public class MyEntry
{
    public ObjectId Id { get; set; }
    public string SimpleHash { get; set; }
    public string GroupIdentifier { get; set; }
}

var update = Update<MyEntry>.Combine(
    Update<MyEntry>.Set(m => SimpleHash, "TheHash!"),
    Update<MyEntry>.Set(m => GroupIdentifier, "MyGroup"));

次に、Updateクエリを使用してドキュメントをコレクションに挿入し、update上記のビルダーオブジェクトを渡します。(もちろん、必要に応じてプロパティを変更できます)。オブジェクトをマージしようとするよりも、このアプローチの方が好きです。これは、部分的にロードされたC#オブジェクトや、設定されていないために誤ってMongoDBドキュメントからプロパティを削除することを心配する必要がないことを意味します。

[BsonIgnoreExtraElements]逆シリアル化中にMyEntryクラスに属性を追加する必要があるか、予期しない余分なデータが検出されたときにドライバーがエラーをスローする可能性があると思います。

于 2013-02-23T21:51:44.343 に答える