我偶然发现了 MongoDB 的一些非常奇怪的行为。对于我的测试用例,我有一个包含 9 个文档的 MongoDB 集合。所有文档都具有完全相同的结构,包括字段 expired_at: Date
和 location: [lng, lat]
。
我现在需要找到所有尚未过期且位于边界框内的文档;我在 map 上显示匹配文档。为此,我设置了以下查询:
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 查询添加排序会破坏结果(请注意,我想要排序,因为我也有一个限制,以避免在更大比例尺上使 map 困惑)。按其他字段排序会产生相同的空结果。这是怎么回事?
(实际上更奇怪:当我放大我的 map 时,我有时会得到 qFull
的结果,即使是排序。有人可能会争辩说 qLocation
是错误的。但是当我只使用 qLocation
,结果总是正确的。而且 qExpiry
对所有文档总是正确的)
最佳答案
您可能想尝试使用聚合框架的 $match
运行相同的查询 和 $sort
管道:
db.docs.aggregate([
{ "$match": qFull },
{ "$sort": { "created_at": -1 } }
]);
或隐式使用 $and
通过指定以逗号分隔的表达式列表,如
db.docs.aggregate([
{
"$match": {
"expired_at": { "$gt" : new Date() },
"location" : {
"$geoWithin" : {
"$box" : [
[ 123.8766, 8.3269 ],
[ 122.8122, 8.24974 ]
]
}
}
}
},
{ "$sort": { "created_at": -1 } }
]);
不太确定为什么 find()
失败了
关于javascript - MongoDB:将 sort() 添加到查询中会破坏 $and 查询的结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42294589/