web-dev-qa-db-ja.com

MongoDB C#ドライバー-バインディングのフィールドを無視

MongoDBとC#を使用してFindOne()を使用する場合、オブジェクトで見つからないフィールドを無視する方法はありますか?

EG、モデル例。

public class UserModel
{
    public ObjectId id { get; set; }
    public string Email { get; set; }
}

また、MongoDBコレクションにパスワードを保存しますが、上記のoutオブジェクトにパスワードをバインドしたくありません。 Getをそうすると、

  var query = Query<UserModel>.EQ(e => e.Email, model.Email);
  var entity = usersCollection.FindOne(query);

次のエラーが表示されます

Element 'Password' does not match any field or property of class 

とにかく、Mongoにモデルと一致しないフィールドを無視するように指示することはありますか?

58
LiamB

はい。 UserModelクラスをBsonIgnoreExtraElements属性で装飾するだけです:

[BsonIgnoreExtraElements]
public class UserModel
{
    public ObjectId id { get; set; }
    public string Email { get; set; }
}

名前が示すように、ドライバーは例外をスローする代わりに余分なフィールドを無視します。詳細はこちら- 余分な要素を無視する

107
i3arnon

さらに別の可能な解決策は、このための規則を登録することです。

このように、すべてのクラスに[BsonIgnoreExtraElements]で注釈を付ける必要はありません。

Mongoクライアントを作成するときのどこかで、以下をセットアップします。

        var pack = new ConventionPack();
        pack.Add(new IgnoreExtraElementsConvention(true));
        ConventionRegistry.Register("My Solution Conventions", pack, t => true);
22
Vetras

はい。 (モデルクラスを編集する代わりに)別の方法は、RegisterClassMapSetIgnoreExtraElementsを使用することです。

あなたの場合、ドライバーを初期化するときにこのコードを追加するだけです:

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

クラスマッピングを使用して余分な要素を無視する方法について詳しくは、こちらを参照してください- 余分な要素を無視する

17