Mongo C# DriveR语言 如何将 ToLower() 应用于 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),然后将所有投影的小写名称group为一组(请参阅:addToSet)。该集合将是您可以从聚合结果中提取的结果。

我的观点是,您应该考虑更改数据,以免增加不必要的计算复杂性,从而占用宝贵的资源。如果这是不可能的,但名称本身相对较少,则可以使用第二种方法。使用第三种方法,并理解它不是理想的,它将增加DBMS方面的更多处理。

最新更新