MongoDB find查询过滤数组nil值后匹配指定长度的实现方法
MongoDB 按排除指定元素后的数组长度匹配文档的find查询方案
以上写法支持MongoDB 3.6及以上版本,为目前主流生产环境的通用兼容方案。
场景1:数组元素直接为"nil"的情况
你之前的写法错误点在于将$size的语法顺序写反,正确逻辑是先用$filter过滤掉"nil"元素,再把过滤后的数组传给$size计算长度,最后和目标长度做等值比较即可,合法写法如下:
db.collection.find({ $expr: { $eq: [ { $size: { $filter: { input: "$arrayProperty", cond: { $ne: [ "$$this", "nil" ] } } } }, 5 // 此处替换为你需要匹配的目标长度 ] } })
场景2:数组元素为JSON对象、嵌套字段值为"nil"的情况
仅需要修改$filter的判断条件,指定对比数组元素的嵌套字段即可,以你给出的示例数据中排除turbo为"nil"的元素为例,写法如下:
db.collection.find({ $expr: { $eq: [ { $size: { $filter: { input: "$arrayProperty", cond: { $ne: [ "$$this.turbo", "nil" ] } } } }, 2 // 此处替换为你需要匹配的目标长度 ] } })
上述示例查询会返回你给出的第二条示例数据,该数据过滤后数组有效长度为2,符合匹配规则。
内容的提问来源于stack exchange,提问作者Will H
相关产品推荐
相关产品推荐

