MongoDB has a vibrant command-line tool to interact with mongo and perform all the operations. One such command is the MongoDB sort command. In this blog, we will deep dive into the sort command and understand it with various examples.
MongoDB sort() method
The sort() method in mongodb is used to sort the data in a particular order based on the user’s requirement. The general syntax for the sort() command follows the below pattern
db.<collection_name>.find({<condition>}).sort({field_name: 1 or -1})
where
- <collection_name> = name of the mongo collection
- find({<condition>}) = command is used to filter out the data before sorting
- 1 means sort in asc order -1 means sort in desc order.
To get started with the mongodb sort() command, let’s first insert the below documents into the mongodb weather collection.
db.weather.insertMany([{ "metadata": [{"sensorId": 5578}, {"type": "temperature"}], "date": ISODate("2021-05-18T00:00:00.000Z"), "temp": 12 }, { "metadata": [{"sensorId": 5578}, {"type": "temperature"}], "date": ISODate("2021-05-18T04:00:00.000Z"), "temp": 11 }, { "metadata": [{"sensorId": 5578}, {"type": "temperature"}], "date": ISODate("2021-05-18T08:00:00.000Z"), "temp": 11 }, { "metadata": [{"sensorId": 5578}, {"type": "temperature"}], "date": ISODate("2021-05-18T12:00:00.000Z"), "temp": 12 }, { "metadata": [{"sensorId": 5578}, {"type": "temperature"}], "date": ISODate("2021-05-18T16:00:00.000Z"), "temp": 16 }, { "metadata": [{"sensorId": 5578}, {"type": "temperature"}], "date": ISODate("2021-05-18T20:00:00.000Z"), "temp": 15 }, { "metadata": [{"sensorId": 5578}, {"type": "temperature"}], "date": ISODate("2021-05-19T00:00:00.000Z"), "temp": 13 }, { "metadata": [{"sensorId": 5578}, {"type": "temperature"}], "date": ISODate("2021-05-19T04:00:00.000Z"), "temp": 12 }, { "metadata": [{"sensorId": 5578}, {"type": "temperature"}], "date": ISODate("2021-05-19T08:00:00.000Z"), "temp": 11 }, { "metadata": [{"sensorId": 5578}, {"type": "temperature"}], "date": ISODate("2021-05-19T12:00:00.000Z"), "temp": 12 }, { "metadata": [{"sensorId": 5578}, {"type": "temperature"}], "date": ISODate("2021-05-19T16:00:00.000Z"), "temp": 17 }, { "metadata": [{"sensorId": 5578}, {"type": "temperature"}], "date": ISODate("2021-05-19T20:00:00.000Z"), "temp": 12 }])
verify if the documents get properly inserted by typing the below command
db.weather.find() { "_id" : ObjectId("61370840925c215ff58518ee"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-18T00:00:00Z"), "temp" : 12 } { "_id" : ObjectId("61370840925c215ff58518ef"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-18T04:00:00Z"), "temp" : 11 } { "_id" : ObjectId("61370840925c215ff58518f0"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-18T08:00:00Z"), "temp" : 11 } { "_id" : ObjectId("61370840925c215ff58518f1"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-18T12:00:00Z"), "temp" : 12 } { "_id" : ObjectId("61370840925c215ff58518f2"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-18T16:00:00Z"), "temp" : 16 } { "_id" : ObjectId("61370840925c215ff58518f3"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-18T20:00:00Z"), "temp" : 15 } { "_id" : ObjectId("61370840925c215ff58518f4"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T00:00:00Z"), "temp" : 13 } { "_id" : ObjectId("61370840925c215ff58518f5"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T04:00:00Z"), "temp" : 12 } { "_id" : ObjectId("61370840925c215ff58518f6"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T08:00:00Z"), "temp" : 11 } { "_id" : ObjectId("61370840925c215ff58518f7"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T12:00:00Z"), "temp" : 12 } { "_id" : ObjectId("61370840925c215ff58518f8"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T16:00:00Z"), "temp" : 17 } { "_id" : ObjectId("61370840925c215ff58518f9"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T20:00:00Z"), "temp" : 12 }
In the subsequent sessions, we will understand how to sort the data based on specific fields.
Mongodb sort by _id
The field name _id
is reserved for the primary key, and its value must be unique in the collection. If you insert a record in mongodb without mentioning a “_id” field,mongodb will add this field to all the documents.
To sort the weather data with the “_id” field, type the below command
db.weather.find().sort({"_id":1}) { "_id" : ObjectId("61370840925c215ff58518ee"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-18T00:00:00Z"), "temp" : 12 } { "_id" : ObjectId("61370840925c215ff58518ef"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-18T04:00:00Z"), "temp" : 11 } { "_id" : ObjectId("61370840925c215ff58518f0"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-18T08:00:00Z"), "temp" : 11 } { "_id" : ObjectId("61370840925c215ff58518f1"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-18T12:00:00Z"), "temp" : 12 } { "_id" : ObjectId("61370840925c215ff58518f2"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-18T16:00:00Z"), "temp" : 16 } { "_id" : ObjectId("61370840925c215ff58518f3"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-18T20:00:00Z"), "temp" : 15 } { "_id" : ObjectId("61370840925c215ff58518f4"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T00:00:00Z"), "temp" : 13 } { "_id" : ObjectId("61370840925c215ff58518f5"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T04:00:00Z"), "temp" : 12 } { "_id" : ObjectId("61370840925c215ff58518f6"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T08:00:00Z"), "temp" : 11 } { "_id" : ObjectId("61370840925c215ff58518f7"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T12:00:00Z"), "temp" : 12 } { "_id" : ObjectId("61370840925c215ff58518f8"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T16:00:00Z"), "temp" : 17 } { "_id" : ObjectId("61370840925c215ff58518f9"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T20:00:00Z"), "temp" : 12 }
- here we are specifying find() without any filter condition, which means we need all the data to be sorted.
- sort({“_id”:1}) means we need to sort the data by _id by asc order.
Mongodb find and sort
Sometimes users do not want to sort the entire data; instead, they need to find some data before filtering it out. Use the below code snippet to achieve this
use case: Filter out the document where temp=12 and then sort the data based on “_id” in asc order.
db.weather.find({"temp": 12}).sort({"_id":1}) { "_id" : ObjectId("61370840925c215ff58518ee"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-18T00:00:00Z"), "temp" : 12 } { "_id" : ObjectId("61370840925c215ff58518f1"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-18T12:00:00Z"), "temp" : 12 } { "_id" : ObjectId("61370840925c215ff58518f5"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T04:00:00Z"), "temp" : 12 } { "_id" : ObjectId("61370840925c215ff58518f7"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T12:00:00Z"), "temp" : 12 } { "_id" : ObjectId("61370840925c215ff58518f9"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T20:00:00Z"), "temp" : 12 }
- find({“temp”: 12}) = This code is used to filter out the data where temp=12.
- sort({“_id”:1}) means we need to sort the data by _id by asc order.
Mongodb sort and limit
Using the mongodb limit() command, we can limit the data while filtering out the data. Type the below command to filter out the data before sorting
use case: Filter out the 3 data where temp=12 and then sort the data based on “_id” in desc order.
db.weather.find({"temp": 12}).sort({"_id": -1}).limit(3) { "_id" : ObjectId("61370840925c215ff58518f9"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T20:00:00Z"), "temp" : 12 } { "_id" : ObjectId("61370840925c215ff58518f7"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T12:00:00Z"), "temp" : 12 } { "_id" : ObjectId("61370840925c215ff58518f5"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T04:00:00Z"), "temp" : 12 }
- find({“temp”: 12}) = This method is used to filter out the data where temp=12.
- sort({“_id”: -1}) = means we need to sort the data by _id by desc order.
- limit(3) = is used to limit the data by 3 documents.
MongoDB sort using multiple fields
To sort the document with multiple fields, we must specify multiple fields in the sort() method. Let’s try to implement the below use case.
Use case:sort the data by temp and date in asc order.
db.weather.find().sort({"temp" : 1, "date": 1}) { "_id" : ObjectId("61370840925c215ff58518ef"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-18T04:00:00Z"), "temp" : 11 } { "_id" : ObjectId("61370840925c215ff58518f0"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-18T08:00:00Z"), "temp" : 11 } { "_id" : ObjectId("61370840925c215ff58518f6"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T08:00:00Z"), "temp" : 11 } { "_id" : ObjectId("61370840925c215ff58518ee"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-18T00:00:00Z"), "temp" : 12 } { "_id" : ObjectId("61370840925c215ff58518f1"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-18T12:00:00Z"), "temp" : 12 } { "_id" : ObjectId("61370840925c215ff58518f5"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T04:00:00Z"), "temp" : 12 } { "_id" : ObjectId("61370840925c215ff58518f7"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T12:00:00Z"), "temp" : 12 } { "_id" : ObjectId("61370840925c215ff58518f9"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T20:00:00Z"), "temp" : 12 } { "_id" : ObjectId("61370840925c215ff58518f4"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T00:00:00Z"), "temp" : 13 } { "_id" : ObjectId("61370840925c215ff58518f3"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-18T20:00:00Z"), "temp" : 15 } { "_id" : ObjectId("61370840925c215ff58518f2"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-18T16:00:00Z"), "temp" : 16 } { "_id" : ObjectId("61370840925c215ff58518f8"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T16:00:00Z"), "temp" : 17 }
- find() = This method is used to fetch all the data.
- sort({“temp” : 1, “date”: 1}) = Here we have passed temp and date both the field in the sort command which will basically sort the date first by temp in asc order and then by date in asc order.
MongoDB aggregates and sort
This session will perform advance aggregation in mongodb via the aggregate() method.
use case: aggregate the data based on temp and sort the id by desc order
db.weather.aggregate({ $group: { "_id":'$temp', "temp": { $sum:1}}}, {$sort: {"_id": -1}}) { "_id" : 17, "temp" : 1 } { "_id" : 16, "temp" : 1 } { "_id" : 15, "temp" : 1 } { "_id" : 13, "temp" : 1 } { "_id" : 12, "temp" : 5 } { "_id" : 11, "temp" : 3 }
- aggregate({ $group: { “_id”:’$temp’, “temp”: { $sum:1}}} = here by using aggregate() method i am counting the no of unique temp and saving the _id as the temp value.
- {$sort: {“_id”: -1} = sort() method is used to sort the data by _id(which is basically the temp) in desc order
Mongodb sort by date
In this session, we will understand how to sort the mongo data by date while querying.
Mongodb sort by date asc
In almost all the mongo collections, users add documents with date fields to filter out the data by date whenever required.
Use case: Sort the data by date in asc order where “temp”: 12
db.weather.find({ "temp": 12 }).sort({"date": 1}) { "_id" : ObjectId("61370840925c215ff58518ee"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-18T00:00:00Z"), "temp" : 12 } { "_id" : ObjectId("61370840925c215ff58518f1"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-18T12:00:00Z"), "temp" : 12 } { "_id" : ObjectId("61370840925c215ff58518f5"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T04:00:00Z"), "temp" : 12 } { "_id" : ObjectId("61370840925c215ff58518f7"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T12:00:00Z"), "temp" : 12 } { "_id" : ObjectId("61370840925c215ff58518f9"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T20:00:00Z"), "temp" : 12 }
- find({“temp”: 12}) = is used to filter out the data where temp=12
- sort({“date”: 1}) = means we need to sort the data by date by asc order.
Mongodb sort by date desc
Type the below command to sort the data by date in desc order.
Use case: Sort the data by date in desc order
db.weather.find().sort({"date": -1}) { "_id" : ObjectId("61370840925c215ff58518f9"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T20:00:00Z"), "temp" : 12 } { "_id" : ObjectId("61370840925c215ff58518f8"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T16:00:00Z"), "temp" : 17 } { "_id" : ObjectId("61370840925c215ff58518f7"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T12:00:00Z"), "temp" : 12 } { "_id" : ObjectId("61370840925c215ff58518f6"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T08:00:00Z"), "temp" : 11 } { "_id" : ObjectId("61370840925c215ff58518f5"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T04:00:00Z"), "temp" : 12 } { "_id" : ObjectId("61370840925c215ff58518f4"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-19T00:00:00Z"), "temp" : 13 } { "_id" : ObjectId("61370840925c215ff58518f3"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-18T20:00:00Z"), "temp" : 15 } { "_id" : ObjectId("61370840925c215ff58518f2"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-18T16:00:00Z"), "temp" : 16 } { "_id" : ObjectId("61370840925c215ff58518f1"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-18T12:00:00Z"), "temp" : 12 } { "_id" : ObjectId("61370840925c215ff58518f0"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-18T08:00:00Z"), "temp" : 11 } { "_id" : ObjectId("61370840925c215ff58518ef"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-18T04:00:00Z"), "temp" : 11 } { "_id" : ObjectId("61370840925c215ff58518ee"), "metadata" : [ { "sensorId" : 5578 }, { "type" : "temperature" } ], "date" : ISODate("2021-05-18T00:00:00Z"), "temp" : 12 }
- find() = This code is used to find all the data
- sort({“date”: -1}) = means we need to sort the data by date by asc order.
Conclusion
I hope you like this tutorial. This tutorial has explored various use cases where the sort() command can be used. Please do let me know if you face any difficulty in following along. Happy learning :)
More to read?
Install MongoDB using docker