【问题标题】:Sort by date string (ascending) on Mongo在 Mongo 上按日期字符串(升序)排序
【发布时间】:2014-09-08 01:17:23
【问题描述】:

我有一个日期列格式为 dd/mm/yyyy 的数据库,我想按日期升序排序。

$cursor = $collection->find($filter)->sort(array('date' => 1, 'tripID' => 1));

日期是一个字符串,我也在过滤tripID,但这方面是有效的。问题是目前我得到:

01/01/2014
01/02/2014
02/01/2014
02/02/2014

我想要的是:

01/01/2014
02/01/2014
01/02/2014
02/02/2014

是否可以使用查询来实现这一点,还是需要在应用程序中完成?

【问题讨论】:

  • 您应该在 MongoDB 中将您的字符串转换为日期,无论如何这都是您必须在应用程序中执行的操作。最大的问题是这里的字符串不是按词法顺序排列的。

标签: php mongodb


【解决方案1】:

假设我们有您问题中给出的列表

> db.dates.insertMany([{ "date": "01/01/2014" },
    { "date": "01/02/2014" },
    { "date": "02/01/2014" },
    { "date": "02/02/2014" }])
{
        "acknowledged" : true,
        "insertedIds" : [
                ObjectId("5a314eae330cc13d0c9b10c4"),
                ObjectId("5a314eae330cc13d0c9b10c5"),
                ObjectId("5a314eae330cc13d0c9b10c6"),
                ObjectId("5a314eae330cc13d0c9b10c7")
        ]
}

在 MongoDB 3.6 中,我们可以使用聚合框架并使用 $dateFromString (https://docs.mongodb.com/manual/reference/operator/aggregation/dateFromString/) 管道运算符将字符串日期转换为日期,然后对值进行排序:

> db.dates.aggregate([
    { "$project" : { "date" : { "$dateFromString" : { "dateString" : "$date"} } } },
    { "$sort" : { "date" : 1 } }
    ])
{ "_id" : ObjectId("5a314eae330cc13d0c9b10c4"), "date" : ISODate("2014-01-01T00:00:00Z") }
{ "_id" : ObjectId("5a314eae330cc13d0c9b10c5"), "date" : ISODate("2014-01-02T00:00:00Z") }
{ "_id" : ObjectId("5a314eae330cc13d0c9b10c6"), "date" : ISODate("2014-02-01T00:00:00Z") }
{ "_id" : ObjectId("5a314eae330cc13d0c9b10c7"), "date" : ISODate("2014-02-02T00:00:00Z") }

从 MongoDB 3.6 开始,有一种解决方法可以将您的字符串转换为词法字符串日期:

> db.dates.aggregate([
    { "$project" : {
        "date" : {
            "$let" : {
                "vars" : { "parts":{ "$split" : [ "$date", "/" ] } },
                "in" : {
                    "$concat" : [
                        { "$arrayElemAt" : [ "$$parts" , 2 ] },
                        "-",
                        { "$arrayElemAt" : [ "$$parts", 1 ] },
                        "-",
                        { "$arrayElemAt" : [ "$$parts", 0 ] } ]
                    }
                }
            }
        }
    },
    { "$sort" : { "date" : 1 } }
])

{ "_id" : ObjectId("5a314eae330cc13d0c9b10c4"), "date" : "2014-01-01" }
{ "_id" : ObjectId("5a314eae330cc13d0c9b10c6"), "date" : "2014-01-02" }
{ "_id" : ObjectId("5a314eae330cc13d0c9b10c5"), "date" : "2014-02-01" }
{ "_id" : ObjectId("5a314eae330cc13d0c9b10c7"), "date" : "2014-02-02" }

我知道这是在 javascript 中,你提到它是在 php 中,但实际上是一样的,请查看 php 文档 (http://php.net/manual/en/mongocollection.aggregate.php)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    相关资源
    最近更新 更多