C#MongoDB驱动程序-如何按数组和项目列表进行过滤

时间:2019-07-14 09:45:36

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

我想对字符串数组进行搜索,并将其与字符串列表中的任何字符串进行比较。例如:

这是数据结构:

{
    "CategoryIds": [ "A123", "B456", "C789" ]
}

这是搜索词:

List<string> search = new List<string> { "A123", "C789" };

我正在动态构建搜索查询,因此我已经为开始定义了这些内容:

var builder = Builders<Item>.Filter;
ar filters = Builders<Item>.Filter.Empty;

我尝试了以下所有方法,但均无效果:

使用ElemMatch

filters &= builder.ElemMatch(i => i.CategoryIds, id => search.CategoryIds.Any(i => i.Equals(id)));

使用Intersect

filters &= builder.Where(i => search.CategoryIds.Intersect(i.CategoryIds).Any());

唯一可行的就是这个:

var categoryFilters = new List<FilterDefinition<Item>>();

foreach (string id in search.CategoryIds)
    categoryFilters.Add(builder.AnyEq(i => i.CategoryIds, id));

if (categoryFilters.Any())
    filters &= builder.Or(categoryFilters);

但是似乎太过分了。有没有更简单的方法可以做到这一点?

1 个答案:

答案 0 :(得分:3)

  • 要将包含个值数组的字段与单个值进行匹配,您需要一个AnyEq过滤器。
  • 要将单个字段值多个值匹配,您需要一个In过滤器。
  • 要将包含一个值数组的字段与多个值进行比较,您需要将两者结合使用,即AnyIn过滤器:
var builder = Builders<Item>.Filter
filter = builder.AnyIn(item => item.CategoryIds, categoryIds)