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

C# MongoDB使用ElemMatch判断数组包含项时抛出格式异常问题

异常原因

你错误使用了ElemMatch过滤器的重载:当你直接给ElemMatch传入字符串值作为第二个参数时,MongoDB C#驱动会将该字符串识别为JSON格式的筛选语句进行解析。你传入的AccountId以0开头,JSON语法规范禁止普通数字以0作为前缀(除0开头的小数外),解析器会把开头的04识别为非法数字格式,直接抛出Invalid JSON number '04'异常。
另外ElemMatch本身的设计场景是匹配数组内的嵌套文档符合指定条件的情况,你的AccountIds是纯字符串类型数组,本身就不适合用ElemMatch实现包含查询。

正确实现方式

直接使用相等过滤器即可,MongoDB会自动对数组字段执行包含匹配:

var accountId = "04935ec9ecf94eb5b57ac9b2957bfb9a";
var filter = Builders<MapDto>.Filter.Eq(x => x.AccountIds, accountId);
var result = await _collection.Find(filter).ToListAsync();

上述代码生成的原生查询等价于{ "AccountIds": "04935ec9ecf94eb5b57ac9b2957bfb9a" },可以正确匹配数组中存在对应值的文档。

如果一定要使用ElemMatch(无实际性能收益,仅作语法演示),需要传入元素匹配表达式而非直接传值:

var filter = Builders<MapDto>.Filter.ElemMatch(x => x.AccountIds, id => id == accountId);
注意事项
  • 存储基础类型(字符串、数字、布尔值)的数组做包含查询时,直接使用Eq过滤器是官方推荐的标准写法,不需要额外调用数组专用匹配方法。
  • 只有当数组元素是嵌套文档,需要匹配文档内多个字段的组合条件时,才有必要使用ElemMatch。

内容的提问来源于stack exchange,提问作者user17365408

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 05:39:19