MongoDB $elemMatch查询嵌套文档时无法匹配insertMany插入数据问题
问题原因
*$elemMatch操作符仅支持对数组类型字段做元素匹配,你遇到的差异本质是两种插入方式生成的contents字段类型不一致:
- 通过MongoDB Compass导入的文档,
contents实际是数组类型,所以$elemMatch可以正常匹配 - 通过
insertMany()插入的文档,contents是你示例里的数字键嵌套对象结构,$elemMatch对普通对象没有匹配逻辑,因此查询无结果
你可以直接查询集合内无过滤的文档,查看contents字段的类型即可验证这个差异。
解决方案
方案一(推荐):统一数据结构为数组
插入数据时统一将contents调整为数组结构,不要转成数字键的对象,你现有的查询语句可以直接复用,所有文档都能正常匹配。
标准数组结构示例:
{ "id": "1234567890", "date": "YYYY-MM-DD", "contents": [ { "content": { "id": "1111111111", "name": "Name 1" } }, { "content": { "id": "2222222222", "name": "Name 2" } }, { "content": { "id": "3333333333", "name": "Name 3" } } ] }
方案二:保留对象结构,修改查询逻辑
如果业务必须保留contents为数字键对象的结构,可以用$objectToArray在查询时做类型转换,匹配符合条件的元素:
{ date: "<some_date_here>", $expr: { $gt: [ { $size: { $filter: { input: {$objectToArray: "$contents"}, cond: {$eq: ["$$this.v.content.id", <some_id_here>]} } } }, 0 ] } }
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

