MongoDB C#驱动程序:如何确保对数组内容使用LINQ表达式的索引

本文关键字:数组 LINQ 索引 表达式 驱动程序 何确保 确保 MongoDB | 更新日期: 2023-09-27 18:30:06

如何确保使用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));

当查找成员[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));

MongoDB C#驱动程序:如何确保对数组内容使用LINQ表达式的索引

我最终使用了以下内容:

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

这可以防止属性重命名,但仍然不如Linq优雅。上面的代码创建了一个类似{ "Members._id" : 1 }的索引。