You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 19:38:13