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

时间:2019-04-03 13:08:36

标签: c# mongodb mongodb-.net-driver

我正在使用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 个答案:

答案 0 :(得分:2)

您可以采用多种方法来产生所需的结果。一些是:

  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的更多处理。