Ini adalah contoh bagaimana melakukannya dengan 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);
PERBARUI
Mengenai indeks di dalam array, yang paling dekat yang dapat saya temukan adalah menggunakan "-1" sebagai indeks saat Anda membuat kunci indeks. Seperti yang saya pahami dari kode sumber github adalah opsi yang valid dalam hal membangun kueri.
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" adalah konstanta hardcode di sisi driver mongodb C# yang berarti "$" (bukti ). Jadi kode ini akan mencoba membuat indeks:
{ "Key1": 1, "Key2.$.Key": 1 }
yang baik untuk menanyakan info dari basis data, tetapi tidak diizinkan (akan mengeluarkan pengecualian "Kunci indeks berisi nama bidang ilegal:nama bidang dimulai dengan '$'") untuk digunakan dalam indeks. Jadi saya berasumsi itu harus diubah di driver mongodb agar berfungsi. Sesuatu seperti "-2" berarti operator kosong. Dalam hal ini kita bisa menggunakan
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);
yang akan menghasilkan indeks seperti:
{ "Key1": 1, "Key2.Key": 1 }
Jadi pada dasarnya menurut saya saat ini tidak mungkin untuk membuat indeks yang Anda inginkan dengan Linq murni tanpa mengubah driver mongo C#.
Jadi saya pikir satu-satunya pilihan Anda lakukan seperti ini, masih C# tetapi tanpa Linq
await collection.Indexes.CreateOneAsync(new BsonDocument {{"name", 1}, {"bars.key", 1}});