Giả sử chúng tôi có danh sách được đưa ra trong câu hỏi của bạn
> 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")
]
}
Trong MongoDB 3.6, chúng ta có thể sử dụng khung tổng hợp và sử dụng $dateFromString
( https://docs.mongodb.com/manual/reference/operator / TỔNG HỢP / dateFromString /
) toán tử đường ống để chuyển đổi ngày chuỗi thành ngày tháng và sau đó sắp xếp giá trị:
> 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") }
Pior to MongoDB 3.6 có một giải pháp để chuyển đổi chuỗi của bạn thành chuỗi từ vựng ngày tháng:
> 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" }
Tôi biết điều này là trong javascript và bạn đã đề cập đến nó trong php, nhưng về mặt thực tế thì nó giống nhau, hãy xem tài liệu php ( http://php.net/manual/en/mongocollection.aggregate.php )