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

配列.NETドライバーのアイテムの属性にMongoDBMultiKeyインデックスを作成する方法

    これは、C#でそれを行う方法の例です

    var indexDefinition = Builders<FooDocument>.IndexKeys.Combine(
        Builders<FooDocument>.IndexKeys.Ascending(f => f.Key1),
        Builders<FooDocument>.IndexKeys.Ascending(f => f.Key2));
    
    await collection.Indexes.CreateOneAsync(indexDefinition); 
    

    更新

    配列内のインデックスに関して、私が見つけた最も近いものは、インデックスキーを作成するときにインデックスとして「-1」を使用することです。 githubから理解しているように、ソースコードはクエリを作成する場合の有効なオプションです。

    var indexDefinition = Builders<FooDocument>.IndexKeys.Combine(
        Builders<FooDocument>.IndexKeys.Ascending(f => f.Key1),
        Builders<FooDocument>.IndexKeys.Ascending(f => f.Key2[-1].Key));
    
    await collection.Indexes.CreateOneAsync(indexDefinition); 
    

    「-1」は、サイドmongodb C#ドライバーのハードコードされた定数で、「$」を意味します(証明 )。したがって、このコードはインデックスを作成しようとします:

    { "Key1": 1, "Key2.$.Key": 1 }
    

    これはデータベースからの情報のクエリには問題ありませんが、インデックスで使用することは許可されていません(「インデックスキーに不正なフィールド名が含まれています:フィールド名は「$」で始まります」という例外がスローされます)。だから私はそれを動作させるためにmongodbドライバーで変更する必要があると思います。 「-2」のようなものは空の演算子を意味します。その場合、

    を使用できます
    var indexDefinition = Builders<FooDocument>.IndexKeys.Combine(
        Builders<FooDocument>.IndexKeys.Ascending(f => f.Key1),
        Builders<FooDocument>.IndexKeys.Ascending(f => f.Key2[-2].Key));
    
    await collection.Indexes.CreateOneAsync(indexDefinition); 
    

    次のようなインデックスが生成されます:

    { "Key1": 1, "Key2.Key": 1 }
    

    基本的に、mongo C#ドライバーを変更せずに、純粋なLinqを使用して必要なインデックスを作成することは今のところ不可能だと思います。

    だから私はあなたの唯一のオプションはこのようにすると思います、それでもC#ですがLinqなし

    await collection.Indexes.CreateOneAsync(new BsonDocument {{"name", 1}, {"bars.key", 1}});
    


    1. MongoDBforSaaSの複数のデータベース

    2. ClassNotFoundExceptionを解決する方法:com.mongodb.connection.BufferProvider?

    3. Mac(os x):redis-cliのみをインストールする方法はありますか?

    4. MongoDBでサブ配列を検索する方法