Това е пример как да го направите с 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 }
Така че по същество не мисля, че в момента е възможно да изградите индекс, който искате, с чист Linq, без да променяте mongo C# драйверите.
Така че мисля, че единствената ви възможност да направите така, все още C#, но без Linq
await collection.Indexes.CreateOneAsync(new BsonDocument {{"name", 1}, {"bars.key", 1}});