【问题标题】:MongoDb sort on date field with $match and $project not workingMongoDb 对日期字段进行排序,$match 和 $project 不起作用
【发布时间】:2019-11-06 05:20:43
【问题描述】:

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

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

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

输出总是一样的。

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

我已经在 Google 上搜索并尝试了大约两个小时。


这是我的查询:

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"
}

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

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

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

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

    【讨论】:

    • 这个成功了!谢谢。我正在获取数据,然后使用 JavaScript 中的自定义函数按时间戳对其进行排序:array.sort(sortJsonByKey("time_stamp")
    • 顺便说一句,什么更好?在 mongoDB 中排序还是在 JavaScript/NodeJs 中排序?
    • 通常最好在 MongoDB 中排序
    【解决方案2】:

    在 mongo-shell 中,我在日期排序方面有任何问题。

    • 这是日期字段的数据。

       db.inputData.find().pretty()
      

    并给出这样的示例数据...

    {
        "_id" : ObjectId("5dc26c292fa53037f6b559aa"),
        "date" : ISODate("2017-04-12T18:30:00Z")
    }
    {
        "_id" : ObjectId("5dc26cb82fa53037f6b559ab"),
        "date" : ISODate("2017-04-14T18:30:00Z")
    }
    {
        "_id" : ObjectId("5dc26cf72fa53037f6b559ac"),
        "date" : ISODate("2017-04-18T18:30:00Z")
    }
    {
        "_id" : ObjectId("5dc26d2e2fa53037f6b559ad"),
        "date" : ISODate("2018-04-18T18:30:00Z")
    }
    { "_id" : ObjectId("5dc26d722fa53037f6b559ae"), "date" : "4/19/2018" }
    { "_id" : ObjectId("5dc26db12fa53037f6b559af"), "date" : "4/19/2019" }
    { "_id" : ObjectId("5dc26dca2fa53037f6b559b0"), "date" : "5/20/2019" }
    
    • 对于这个 inputData,这里是聚合管道,仅用于排序日期字段。

      db.inputData.aggregate([{$sort:{date:-1}}]) 
      
    • 通过在聚合排序数据之上运行是..

           { "_id" : ObjectId("5dc26d2e2fa53037f6b559ad"), "date" : ISODate("2018-04-18T18:30:00Z") }
           { "_id" : ObjectId("5dc26cf72fa53037f6b559ac"), "date" : ISODate("2017-04-18T18:30:00Z") }
           { "_id" : ObjectId("5dc26cb82fa53037f6b559ab"), "date" : ISODate("2017-04-14T18:30:00Z") }
           { "_id" : ObjectId("5dc26c292fa53037f6b559aa"), "date" : ISODate("2017-04-12T18:30:00Z") }
           { "_id" : ObjectId("5dc26b2e2fa53037f6b559a9"), "date" : ISODate("1970-01-01T00:00:00Z") }
           { "_id" : ObjectId("5dc26dca2fa53037f6b559b0"), "date" : "5/20/2019" }
           { "_id" : ObjectId("5dc26db12fa53037f6b559af"), "date" : "4/19/2019" }
           { "_id" : ObjectId("5dc26d722fa53037f6b559ae"), "date" : "4/19/2018" }
      
    • 一件重要的事情,对于日期字段,如果你想将它从字符串转换为日期,你必须运行这个脚本..

           db.inputData.find().forEach(function(doc){
                 doc.date = new Date(doc.date);
                 db.inputData.save(doc);
           })
      

    【讨论】:

      【解决方案3】:

      您的第一个查询答案是。

      db.getCollection('inputData').aggregate(
        [{ $match: { "_id": new mongoose.Types.ObjectId(objectId) } }
        ,{ $project: { "date": 1 }}
        ,{ $sort: { "date": -1 }}]
        ,function (err, docs) {}
      )
      

      【讨论】:

      • 是在 NodeJs 中还是在 Robo3t 中?
      • 实际上,它也不起作用。我的 NodeJs 代码是错误回调第一个代码,在 Robo3t 中排序顺序没有改变:/* 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" }
      • 你和userId匹配了吗?
      • 查询中的用户ID怎么可能不匹配?有点奇怪。我在网上看到了这些示例,但由于某种原因它们对我不起作用。
      猜你喜欢
      • 1970-01-01
      • 2020-08-07
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      • 2013-03-10
      相关资源
      最近更新 更多