【问题标题】:Aggregation Framework Sort by Date issues with blanks聚合框架按日期排序问题与空白
【发布时间】:2015-05-27 20:35:55
【问题描述】:

我正在使用 MongoDB 中的聚合框架按日期字段对结果集进行排序。除了排序字段中具有空白日期的记录外,排序工作正常。如何将这些空白移到已排序结果集合的末尾,同时为带日期的空白保持最早到最新的排序顺序?

query.where('state','published').sort('startDate');

【问题讨论】:

    标签: mongodb sorting aggregation-framework


    【解决方案1】:

    假设我的收藏中有以下文档:

    { "_id" : ObjectId("55669d58d70a9b1a45e11ed5"), "state" : "published", "startDate" : "Thu May 28 2015 07:45:12 GMT+0300" }
    { "_id" : ObjectId("55669d62d70a9b1a45e11ed6"), "state" : "published", "startDate" : "     " }
    { "_id" : ObjectId("55669d67d70a9b1a45e11ed7"), "state" : "published", "startDate" : "" }
    { "_id" : ObjectId("55669d6ad70a9b1a45e11ed8"), "state" : "published", "startDate" : "Thu May 28 2015 07:45:30 GMT+0300" }
    { "_id" : ObjectId("55669ec4d70a9b1a45e11ed9"), "state" : "published" }
    

    您可以使用$regex过滤带有空白日期的文档

    db.test.aggregate([{"$match": {"state": "published", "startDate": /\S+/}}, {$sort: {"startDate": 1}}])
    

    输出:

    { "_id" : ObjectId("55669d58d70a9b1a45e11ed5"), "state" : "published", "startDate" : "Thu May 28 2015 07:45:12 GMT+0300" }
    { "_id" : ObjectId("55669d6ad70a9b1a45e11ed8"), "state" : "published", "startDate" : "Thu May 28 2015 07:45:30 GMT+0300" }
    

    编辑:

    如果您按startDate 对文档进行降序排序,则会得到预期的结果。

    db.test.aggregate(
        [
            { "$match": { "state": "published" }}, 
            { $sort: { "startDate": -1 }}
        ]
    )
    

    【讨论】:

    • 但是我仍然需要输出带有空白 startDates 的文档,就在输出集合的末尾。
    • 谢谢@Michael,但我正在使用的数据是未来日期(按降序排序将最远的未来发生的事件放在第一位)。
    • @JRulle 您无法按升序对数据进行排序,并且数据末尾有空白日期。您将需要在查询中过滤具有空白日期的文档或编写两个查询并合并结果。
    • 我实际上正在使用 $project 为每个文档创建一个新字段,该字段将文档简单地分类为日期和节点。从那时起,我将首先在日期/节点类别字段上排序,然后在 startDate 字段上。
    猜你喜欢
    • 2013-01-22
    • 2018-04-25
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 2013-01-12
    • 1970-01-01
    • 2013-06-03
    相关资源
    最近更新 更多