首页 > 解决方案 > MongoDb 对日期字段进行排序,$match 和 $project 不起作用

问题描述

在 mongoDb 查询中按“日期”字段排序时,我没有看到任何类型的数据排序。“date_recorded”字段是一个日期字段。

我还尝试对 time_stamp 字段进行排序。无论是升序还是降序,排序顺序似乎都不起作用。

我似乎无法弄清楚为什么它不起作用。我已经尝试过: - 使用“聚合”选项卡的指南针。- Robo3t - 使用 NodeJs 的 VSCode(模式模型查询)

输出始终相同。

任何帮助来完成这项工作将不胜感激......

我一直在搜索谷歌并尝试不同的东西大约两个小时。


这是我的查询:

db.getCollection('inputData').aggregate(
    { $match: { "inputData_userID": { $eq: "user1" } } }
    ,{ $project: { "date": 1 }}
    ,{ $sort: { "date_recorded": -1 }}
    ,function (err, docs) {}
)



这是输出:

/* 1 */
{
    "_id" : "0f30df7453b6096da524d3b61ce75eb1",
    "date" : "4/13/2017"
}

/* 2 */
{
    "_id" : "081be472b94804ae597706aa2bc4d9f4",
    "date" : "4/18/2017"
}

/* 3 */
{
    "_id" : "0005933cda516a4df346bf0807ab6ca4",
    "date" : "5/19/2017"
}

/* 4 */
{
    "_id" : "3a67cc9a5eb0a9197fa5448773bfec88",
    "date" : "4/14/2017"
}

/* 5 */
{
    "_id" : "1aefe9e79faaf4d65c6194b162311e08",
    "date" : "4/13/2017"
}

/* 6 */
{
    "_id" : "3f4c9d65c207d5cf620a00cee062a4c8",
    "date" : "4/13/2017"
}



这是另一个查询:

db.getCollection('inputData').find(
    { "inputData_userID": { $eq: "user1" } } 
    ,{ "_id": 0, "date": 1, "date_recorded": 1 }
    ,{ $sort: { "date_recorded": -1 }}
)



这是此查询的输出结果:

/* 1 */
{
    "date_recorded" : ISODate("2017-04-13T08:54:24.024Z"),
    "date" : "4/13/2017"
}

/* 2 */
{
    "date_recorded" : ISODate("2017-04-18T22:01:20.767Z"),
    "date" : "4/18/2017"
}

/* 3 */
{
    "date_recorded" : ISODate("2017-05-19T00:03:03.081Z"),
    "date" : "5/19/2017"
}

/* 4 */
{
    "date_recorded" : ISODate("2017-04-14T06:12:55.320Z"),
    "date" : "4/14/2017"
}

/* 5 */
{
    "date_recorded" : ISODate("2017-04-13T23:53:22.692Z"),
    "date" : "4/13/2017"
}

/* 6 */
{
    "date_recorded" : ISODate("2017-04-13T08:55:38.721Z"),
    "date" : "4/13/2017"
}

标签: mongodbmongodb-queryaggregation-framework

解决方案


一个聚合管道阶段的输出为下一个阶段提供输入,因此您需要将其包含date_recorded在您的$project阶段中,以便您可以在接下来的阶段中对其进行排序$sort。但是您还需要将阶段放在一个数组中,而不是将它们作为单独的参数提供:

db.getCollection('inputData').aggregate([
     { $match: { inputData_userID: "user1" }}
    ,{ $project: { date: 1, date_recorded: 1 }}
    ,{ $sort: { date_recorded: -1 }}]
    ,function (err, docs) { ... }
)

请注意,我还简化了您的$match表达式,因为您不需要在$eq此处使用。


推荐阅读