How can I sort into that nulls are last ordered in mongodb?

前端 未结 2 414
日久生厌
日久生厌 2020-11-30 13:05

I excute this query in the mongo shell

db.getCollection(\'list\').find({}).sort({next_time: 1})

the result is

next_time
-         


        
相关标签:
2条回答
  • 2020-11-30 13:07

    Perhaps you can use aggregation and an artificially high end date:

    c = db.foo.aggregate([
    {$project: {
                next_time: 1,
                nlt: { $ifNull: [ "$next_time", new ISODate("9000-01-01") ] }
      }     
    }
    ,
    {$sort: { "nlt": 1}}
                      ]);
    c.forEach(function(r) { printjson(r); });
    

    Alternatively, if the majority of the material has nulls and you don't want to deal with those docs at all, then filter them out and just $sort the remainder:

    db.foo.aggregate([
    {$match: {"nt": {$exists: true}}}
    ,
    {$sort: { "nt": 1}}
                     ]);
    
    0 讨论(0)
  • 2020-11-30 13:25

    If you can add fields to your documents, you could add an "inverted" field that, when you sort it in descending order, would return your documents in ascending order.

    Just to clarify: mongo considers null values as the "smallest" ones, so they appear first when sorting in ascending order, and appear last when sorting in descending order.

    So, if your elements are like this:

    {
      ...
      next_time: ISODate("2020-05-01")
    }
    

    Since ISODate("2020-05-01").getTime() is 1588291200000, you may add:

    {
      ...
      next_time: ISODate("2020-05-01"),
      next_time_inverted: -1588291200000
    }
    

    And then sort the inverted value in descending order:

    db.getCollection('list').find({}).sort({next_time_inverted: -1})
    

    Don't forget to add an index on that field when necessary.

    0 讨论(0)
提交回复
热议问题