javascript - MongoDB:将 sort() 添加到查询中会破坏 $and 查询的结果集

标签 javascript mongodb sorting

我偶然发现了 MongoDB 的一些非常奇怪的行为。对于我的测试用例,我有一个包含 9 个文档的 MongoDB 集合。所有文档都具有完全相同的结构,包括字段 expired_at: Datelocation: [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/

相关文章:

javascript - 带有 Rxjs 问题的 Redux 可观察史诗

javascript - date-fns:如何以 YYYY-MM-DDThh:mm:ss:dddddd 格式获取当前日期和时间

javascript - 函数 insertMany() 无序 : proper way to get both the errors and the result?

MYSQL 内部连接按日期时间升序排序

r - 按特定值对字符串进行排序

Java集合排序

javascript - Youtube JSAPI,示例不起作用

javascript - 最佳游戏 handle 轮询频率是多少?

json - Mongoose:保存具有不同模式的嵌套 JSON

node.js - Nodejs和mongodb之间数据库连接不成功