MongoDB基于CodeId的过滤查询不生效问题求助
问题排查与解决方案
1. 实体类属性映射错误
首先看RecipientsDocument类的Type属性:
[BsonElement("Typer")] public string Type { get; set; }
数据库中该字段实际是"Type",但代码里映射成了"Typer",这会导致数据序列化/反序列化异常,直接修正映射:
[BsonElement("Type")] public string Type { get; set; }
2. CodeId过滤逻辑失效
当前嵌套Any的Linq表达式无法被MongoDB驱动正确转换为高效查询,替换为ElemMatch结合包含判断的写法,同时处理CodeId为可空类型的情况:
// 替换原CodeIds Filter代码 if(item.CodeIds != null && item.CodeIds.Any()) { filter &= filterDefinition.ElemMatch(n => n.Recipients, r => r.CodeId != null && item.CodeIds.Contains(r.CodeId.Value)); }
3. 其他潜在笔误修正
BuildFilter方法的参数类型写错:原参数NotificheQueryFilter应为NotificationQueryFilter,修正后方法签名:private static FilterDefinition<Notification> BuildFilter(NotificationQueryFilter item)- 排序字段
DataInserimento未在实体类中定义,需确认实体类是否包含该字段,或替换为已存在的字段(比如Read或自定义时间字段)。
修正后的完整BuildFilter方法
private static FilterDefinition<Notification> BuildFilter(NotificationQueryFilter item) { var filterDefinition = Builders<Notification>.Filter; FilterDefinition<Notification> filter = FilterDefinition<Notification>.Empty; // Code filter if (!string.IsNullOrEmpty(item.CodeFilter)) { filter &= filterDefinition.ElemMatch(x => x.Recipients, dest => dest.Code == item.CodeFilter); } // 修正后的CodeIds Filter if(item.CodeIds != null && item.CodeIds.Any()) { filter &= filterDefinition.ElemMatch(n => n.Recipients, r => r.CodeId != null && item.CodeIds.Contains(r.CodeId.Value)); } // 补充Type过滤(原QueryFilter中Type参数未被使用) filter &= filterDefinition.ElemMatch(x => x.Recipients, dest => dest.Type == item.Type.ToString()); return filter; }
完成以上修正后,调用GetByCode方法即可正确匹配第1条和第4条文档。
内容的提问来源于stack exchange,提问作者DevMD
相关产品推荐
相关产品推荐

