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

C# MongoDB Driver - How to filter by arrays and a list of items

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

这是数据结构:

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

这是搜索词:

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

我正在动态构建我的搜索查询,所以我为开始定义了这些:

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

我尝试了以下所有方法,但 none 有效:

使用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);

但这似乎有点矫枉过正。有更简单的方法吗?

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