如何使用{$gte:3}和{$lte:6}查询score数组元素均在3-6间的MongoDB文档
MongoDB查询:匹配数组所有元素均在指定范围的文档
要实现你需要的查询效果,可不能直接用{score: {$gte: 3, $lte: 6}}——这个写法会返回至少有一个元素满足范围条件的文档,完全不符合“所有元素都在3到6之间”的需求。
正确的思路是反向排除:找出那些不存在任何元素超出[3,6]范围的文档,我们可以用$not结合$elemMatch来实现:
db.collection.find({ score: { $not: { $elemMatch: { $lt: 3, $gt: 6 } } } })
逻辑拆解:
$elemMatch: { $lt:3, $gt:6 }用于匹配数组中存在小于3或者大于6元素的文档- 外层的
$not会反转这个匹配结果,最终返回的就是所有不存在这类违规元素的文档——也就是数组里所有元素都落在3到6之间(包含边界)的文档
执行这个查询后,会精准返回你预期的结果:
{ "_id" : 3, "score" : [ 5, 5 ] }
另外还有一种等价的写法,逻辑是分开排除两类违规文档:
db.collection.find({ $and: [ { score: { $not: { $elemMatch: { $lt: 3 } } } }, { score: { $not: { $elemMatch: { $gt: 6 } } } } ] })
它会分别排除存在元素小于3的文档,以及存在元素大于6的文档,最终得到的结果和第一种写法完全一致,你可以根据习惯选择使用。
内容的提问来源于stack exchange,提问作者Meg
相关产品推荐
相关产品推荐

