【问题标题】:MongoDB: adding sort() to query ruins result set for $and queryMongoDB:添加 sort() 以查询 $and 查询的结果集
【发布时间】:2017-07-06 18:46:52
【问题描述】:

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


【解决方案1】:

您可能想尝试使用聚合框架的 $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() 会失败

【讨论】:

    【解决方案2】:

    chridam 建议使用 MongoDB 的聚合框架被证明是可行的方法。我的工作查询现在看起来像这样:

    db.docs.aggregate(
        [ 
          { $match : { $and : [qExpiry, qLocation]} },
          { $sort: {"created_at": -1} }.
          { $limit: 50 }.
        ]
    );
    

    尽管如此,如果有人能指出我的第一种方法不起作用的方式,那将非常有用。简单地将sort() 添加到非空查询不应突然返回 0 个文档。只是补充一下,因为我仍然尝试了一下,.sort({}) 返回所有文档但不是很有用。其他一切都失败了,包括.sort({'_id': 1})

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-23
      • 1970-01-01
      • 2017-03-16
      • 2022-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多