1

私はmongo .netクライアントを使用しており、オブジェクト機能へのコレクションを使用しています。スキーマの進化で遭遇した問題

たとえば、フィールド名をコメントからコメントに変更するなど、クラスのフィールドの名前を変更し、クラスでこの変更を行うと、フェッチを実行するとMongoから例外が発生します。

私の期待は、mongoクライアントがコレクションに存在するが私の.netクラスには存在しないフィールドを無視することです。

bson と .net クラスの間の変換を行わずに、可能であれば幸いです。

4

1 に答える 1

2

BsonElement古い名前を引き続き使用する場合は、次の属性を使用できます。

class Demo {
    [BsonElement("Comment")]
    public string Comments { get; set; }
} 

その構文を使用すると、MongoDB C# ドライバーCommentsは、ドキュメント内のフィールドのプロパティ/フィールドのデータを という名前のフィールドで検索するように指示されCommentます。つまり、古い場所からのデータの移動/コピーについて心配する必要はありません。実際の BSON ドキュメント サイズを最小限に抑えながら、ソース コードでより長いフレンドリ名を使用できるようにするためによく使用されます (完全なプロパティ名は常にデータベース コレクションのドキュメントに格納されるため)。短縮するときは、たとえば次のように使用できます。

[BsonElement("c")]
public string Comments { get; set; }

一部の MongoDB ドライバーには、この機能がありません (そして、あるといいのですが!)。

次に、クラスに特別な属性を追加するだけで、クラスの未知の要素をすべて無視し、例外をスローしないようにすることもできます。

[BsonIgnoreExtraElements]
public Demo {
    public string Comments { get; set; }
}

次に、という名前のフィールドCommentが見つかったが、C# クラスのプロパティと一致しない場合、それは無視されます。スキーマが変更されるため、開発中にこれを使用することがよくありますが、後で削除して、予期しないフィールドをキャッチできるようにします。

または、 を使用BsonClassMapして同様の変更を行うこともできます。

BsonClassMap.RegisterClassMap<Demo>(cm => {
    cm.AutoMap();
    cm.SetIgnoreExtraElements(true);
});

完全な制御が必要な場合は、ここに記載されているさらにいくつかのオプションがあります。

于 2013-10-27T14:22:09.537 に答える