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
相关产品推荐
相关产品推荐

