【发布时间】:2017-07-06 18:46:52
【问题描述】:
我偶然发现了 MongoDB 的一些非常奇怪的行为。对于我的测试用例,我有一个包含 9 个文档的 MongoDB 集合。所有文档都具有完全相同的结构,包括字段expired_at: Date 和location: [lng, lat]。
我现在需要找到所有尚未过期且在边界框内的文档;我在地图上显示匹配文件。为此,我设置了以下查询:
var qExpiry = {"expired_at": { $gt : new Date() } };
var qLocation = { "location" : { $geoWithin : { $box : [ [ 123.8766, 8.3269 ] , [ 122.8122, 8.24974 ] ] } } };
var qFull = { $and: [ qExpiry, qLocation ] };
由于过期日期已经过去很久了,并且当我将边界框设置得足够大时,以下查询按预期为我提供了所有 9 个文档:
db.docs.find(qExpiry);
db.docs.find(qLocation);
db.docs.find(qFull);
db.docs.find(qExpiry).sort({"created_at" : -1});
db.docs.find(qLocation).sort({"created_at" : -1});
现在是这样:以下查询返回 0 个文档:
db.docs.find(qFull).sort({"created_at" : -1});
仅向 AND 查询添加排序会破坏结果(请注意,我想要排序,因为我也有一个限制,以避免在更大的比例上混乱地图)。按其他字段排序会产生相同的空结果。这是怎么回事?
(实际上更奇怪:当我放大我的地图时,有时我会得到qFull 的结果,即使是排序也是如此。有人可能会说qLocation 是错误的。但是当我只使用qLocation 时,结果是始终正确。无论如何,qExpiry 始终适用于所有文档)
【问题讨论】:
-
您是否尝试过使用聚合框架的
$match和$sort管道运行相同的查询? -
@chridam -- 哇,成功了!我将提供一个答案,因为这似乎其他人也可能遇到。知道为什么这种方式有效而我最初的方法无效吗?
标签: javascript mongodb sorting