MongoDb在$ match和$ project上的日期字段上排序不起作用

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

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

我似乎无法弄清楚为什么它不起作用。我已经尝试过: -使用“汇总”选项卡进行指南针。 -Robo3t -使用NodeJ的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"
}
sgdtiancai 回答:MongoDb在$ match和$ project上的日期字段上排序不起作用

一个聚合管道阶段的输出为下一阶段提供了输入,因此您需要在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表达式。

,

您的第一个查询是。

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

在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);
         })
    
本文链接:https://www.f2er.com/3154813.html

大家都在问