sql >> データベース >  >> NoSQL >> MongoDB

idと呼ばれるフィールドに対するMongoDBLINQプロバイダーの奇妙な動作

    MongoDBでは、データベースに保存されているすべてのドキュメントに「_id」というフィールド(ルートレベル)が必要です。

    C#ドライバーは、「Id」、「id」、または「_id」と呼ばれるクラス内のすべてのフィールドが、特別な「_id」フィールドにマップされることを想定しています。これは慣例であり、オーバーライドできます。 C#ドライバーは、Resultクラスがコレクションのルートドキュメントとして使用されることを意図していないことを認識しないため、「id」フィールドを検索し、データベース内の「_id」にマップします。

    これをオーバーライドできる1つの方法は、クラス内のフィールドの名前を変更することです(発見したとおり)。次に、[BsonElement]属性を使用して、C#フィールド名(「idd」など)をデータベースで実際に使用されている名前(「id」など)にマップすることもできます。例:

    public class Result
    {
        [BsonElement("id")]
        public int idd; // matches "id" in the database
        // other fields
    }
    

    もう1つの方法は、クラスの「Id」メンバーを見つける規則をオーバーライドして、ResultクラスのC#ドライバーのデフォルトの動作を抑制することです。これを行うには、Resultクラスに新しいConventionProfileを登録します。例:

    var noIdConventions= new ConventionProfile();
    noIdConventions.SetIdMemberConvention(new NamedIdMemberConvention()); // no names
    BsonClassMap.RegisterConventions(noIdConventions, t => t == typeof(Result));
    

    Resultクラスがマップされる前に、プログラムの非常に早い段階でこれを行う必要があります。



    1. オーバーロードされたプロパティLaravelMongoDBの間接的な変更

    2. Mongoの集約パイプラインの$unwindフェーズ中に長さゼロの値を保持するにはどうすればよいですか?

    3. mongodbのネストされた配列要素を更新します

    4. MongoDB Aggregationでさまざまなドキュメントの配列を合計するにはどうすればよいですか?