Mongo C# 驱动程序 - 如何将 ToLower() 应用于 DistinctAsyc

Mongo C# Driver - How to apply ToLower() to a DistinctAsyc

我正在使用 DistinctAsync 从 MongoDB 中检索字符串列表。问题是结果是不同的,除了我得到的一些值都是大写的,有些是小写的,这当然算作不同。

如何将 .ToLower() 应用于此查询?

public async Task<List<string>> GetAllAuthorsUserNames()
{
    var filter = Builders<Episode>.Filter.Where(x => x.CreatedBy != null);

    var cursor = await GetCollection().DistinctAsync(o => o.CreatedBy, filter);

    return cursor.ToList();
}

我试过了,但没用:

var cursor = await GetCollection().DistinctAsync(o => o.CreatedBy.ToLower(), filter);

您可以采用多种方法来获得您想要的结果。一些是:

  1. 仅以小写形式存储作者的姓名(或至少以一致的方式,这样您就不必首先转换他们的姓名以在其中产生不同的姓名),在这种情况下一个不同的查询就足以让你得到想要的结果。

  2. 从当前数据中获取不同作者的姓名后,将他们的姓名映射到内存中各自的小写版本,然后对其应用另一个不同的函数以获取所有作者的小写且不同的姓名形式。看起来像:

var filter = ...
var cursor = await GetCollection().DistinctAsync(v => v.CreatedBy, filter);
var list = await cursor.ToListAsync();

var names = list.Select(v => v.ToLower()).Distinct().ToList();
  1. 使用聚合。基本上,您可以将所有作者的姓名 project 转换为各自的小写形式(参见:toLower) and then group all the projected lowercase names to a set (see: addToSet)。该集合将是您可以从聚合结果中提取的结果。

我的意见是您应该考虑更改数据,以免增加占用宝贵资源的不必要的计算复杂性。如果那不可能,但名称本身相对较少,则可以使用第二种方法。使用第三种方法时要知道它不是理想的方法,它会增加 DBMS 的处理量。