我如何使用MongoDB c#驱动程序(版本2)搜索嵌套条件
本文关键字:搜索 嵌套 条件 版本 何使用 MongoDB 驱动程序 | 更新日期: 2023-09-27 17:52:56
我有一个文档集合,其中可以包含按类别分组的标准。结构可以像这样:
{
"Name": "MyDoc",
"Criteria" : [
{
"Category" : "Areas",
"Values" : ["Front", "Left"]
},
{
"Category" : "Severity",
"Values" : ["High"]
}
]
}
我用来为标准创建嵌入文档的类如下所示:
public class CriteriaEntity
{
public string Category { get; set; }
public IEnumerable<string> Values { get; set; }
}
用户可以从每个类别中选择要搜索的条件(在函数中称为IEnumerable<CriteriaEntity>
),文档必须包含所有选择的条件才能返回。这是我的第一次尝试:
var filterBuilder = Builders<T>.Filter;
var filters = new List<FilterDefinition<T>>();
filters.Add(filterBuilder.Exists(entity =>
userCriterias.All(userCriteria =>
entity.Criteria.Any(entityCriteria =>
entityCriteria.Category == userCriteria.Category
&& userCriteria.Values.All(userValue =>
entityCriteria.Values.Any(entityValue =>
entityValue == userValue))))));
然而,我得到错误:"无法确定实体的序列化信息…"。我怎样才能让它工作?
MongoDB。驱动程序2.0不支持Linq.All。无论如何,你的任务可以通过以下方式解决:
var filterDefinitions = new List<FilterDefinition<DocumentEntity>>();
foreach (var criteria in searchCriterias)
{
filterDefinitions
.AddRange(criteria.Values
.Select(value => new ExpressionFilterDefinition<DocumentEntity>(doc => doc.Criterias
.Any(x => x.Category == criteria.Category && x.Values.Contains(value)))));
}
var filter = Builders<DocumentEntity>.Filter.And(filterDefinitions);
return await GetCollection<DocumentEntity>().Find(filter).ToListAsync();