【发布时间】:2011-02-11 06:24:45
【问题描述】:
我在下面有一个问题。我想要获取 4 到 6 之间的项目,所以只有 a:1 应该匹配,因为它在 b 中的值为 5。
> db.test.find({ b : { $gt : 4 }, b: {$lt : 6}});
{ "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 3, 4, 5 ] }
{ "_id" : ObjectId("4d54d0074364000000004332"), "a" : 2, "b" : [ 2, 4, 6, 8 ] }
>
有人能说出为什么 a:2 匹配这个查询吗?我真的不明白为什么它会被退回。
我也尝试了教程中指定的内容,但 id 似乎不起作用:
> db.test.find({ b : { $gt : 4, $lt : 6}});
{ "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 3, 4, 5 ] }
{ "_id" : ObjectId("4d54d0074364000000004332"), "a" : 2, "b" : [ 2, 4, 6, 8 ] }
>
这个是为了避免对 GT/GTE 造成任何混淆
> db.test.find({b: {$gt: 4.5, $lt: 5.5}});
{ "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 3, 4, 5 ] }
{ "_id" : ObjectId("4d54d0074364000000004332"), "a" : 2, "b" : [ 2, 4, 6, 8 ] }
>
只应返回 a:1。
按照建议,我尝试了 $elemMatch,但它似乎也不起作用(objectIds 不同,因为我在不同的机器上)
> db.test.find();
{ "_id" : ObjectId("4d5a24a5e82e00000000433f"), "a" : 1, "b" : [ 2, 3, 4, 5 ] }
{ "_id" : ObjectId("4d5a24bbe82e000000004340"), "a" : 2, "b" : [ 2, 4, 6, 8 ] }
> db.test.find({b: {$elemMatch: {$gt : 4, $lt: 6 }}});
>
没有文件被退回。
【问题讨论】:
-
其实两个文档都应该返回,问题的意思是“给我所有
b的值在4到6之间的文档”,这两个文档都满足。您能否更详细地解释它要查询的内容?为什么要找到第一个文档而不是第二个? -
正如你上面所说,我想要所有 b 介于 4 和 6 之间的文档。只有 a:1 满足这一点(不能同时满足两者),因为 a:2 不包含 4 和 6 之间的任何值(使用gt 和 lt 排除 4 和 6 本身,而 gte 和 lte 将包括它们)。我尝试了一个更清晰的不同查询(请参阅已编辑的问题),但它仍然无法正常工作......
-
我明白你现在的意思了,我认为它是一个范围(范围通常包括第一个元素),但当然不是,它是严格的小于和大于。我已经删除了我的答案,因为现在很明显它是错误的。
标签: mongodb