Драйвер MongoDB C #: как обеспечить индекс с использованием выражений LINQ для содержимого массива?

Как обеспечить индексирование содержимого массива с помощью выражений LINQ с помощью драйвера MongoDB C #?

В настоящее время у меня есть объект домена, который выглядит примерно так:

public class Team
{
    public Team()
    {
        Members = new List<LazyReference>();
    }

    public MongoDB.Bson.ObjectId Id { get; set; }
    public string DisplayName { get; set; }
    public LazyReference Leader { get; set; }
    public List<LazyReference> Members { get; private set; }
}

public class LazyReference
{
    public MongoDB.Bson.ObjectId Id { get; set; }
}

В моей коллекции я инициализировал пару таких индексов:

collection.EnsureIndex(IndexKeys<Team>.Ascending(t => t.DisplayName), IndexOptions.SetUnique(true));
collection.EnsureIndex(IndexKeys<Team>.Ascending(t => t.Leader.Id), IndexOptions.SetUnique(false));

Как я могу сделать то же самое, чтобы обеспечить быстрый индекс участников при поиске по Members [n] .Id, где n - любой из членов? Я знаю, что могу создать индекс следующим образом, но поскольку при этом не используются выражения LINQ, это небезопасно для будущих переименований свойств.

collection.EnsureIndex(new IndexKeysBuilder().Ascending("Members._id"), IndexOptions.SetUnique(false));

Я также пробовал следующее, но он индексирует только указанный индекс:

collection.EnsureIndex(IndexKeys<Team>.Ascending(t => t.Members[0].Id), IndexOptions.SetUnique(false));

person Matt DeKrey    schedule 02.09.2013    source источник
comment
LazyReference ваш собственный класс? Не могли бы вы опубликовать его код или описать его назначение?   -  person Zaid Masud    schedule 18.09.2013
comment
@ZaidMasud, я обновился, чтобы включить базовое объявление LazyReference. В конечном счете, то, что я предоставил, - это все, что имеет отношение к этому примеру, поскольку остальное - это методы и непостоянные свойства.   -  person Matt DeKrey    schedule 18.09.2013


Ответы (1)


В итоге я использовал следующее:

await collection.Indexes.CreateOneAsync(Builders<Team>.IndexKeys.Ascending($"{nameof(Team.Members)}.{nameof(LazyReference.Id)}"), new CreateIndexOptions() { Unique = false });

это защищает от переименования свойств, но все же не так элегантно, как Linq. Приведенный выше код создает индекс типа { "Members._id" : 1 }.

person faisal    schedule 29.12.2016
comment
Похоже, это сработает; конечно, когда я задал вопрос, nameof не был вариантом! К сожалению, у меня давно не было возможности проверить это, но я все равно с этим согласен. Спасибо, что поделился! - person Matt DeKrey; 29.12.2016