MongoDB排序
时间:2020-02-23 14:40:52 来源:igfitidea点击:
MongoDB排序方法按用户在输入参数中指定的升序或者降序对文档进行排序。
MongoDB排序
MongoDB排序方法的语法为:
{ $sort:{<field1>:<sort order>........}}
排序顺序可以采用以下值:
1:指定字段应按升序排序
-1:指定字段应按降序排序
MongoDB排序示例
让我们看一个对字段排序的例子。
请注意,您可以使用MongoDB插入来创建示例数据。
>db.car.find().sort({speed:-1}) { "_id" : ObjectId("5471d72e0ce70a7026ebefee"), "name" : "Esteem", "color" : "JetRed", "cno" : "H414", "mfdcountry" : "Italy", "speed" : 65 } { "_id" : 3, "name" : "Alto", "color" : "Silver", "cno" : "H413", "mfdcountry" : "San Franceco", "speed" : 55 } { "_id" : 2, "name" : "Volkswagen", "color" : "Blue", "cno" : "H412", "mfdcountry" : "Japan", "speed" : 52 } { "_id" : 1, "name" : "Polo", "color" : "White", "cno" : "H411", "mfdcountry" : "Germany", "speed" : 45 }
按速度字段的降序对收车文档进行排序。
>db.car.find().sort({name:1}) { "_id" : 3, "name" : "Alto", "color" : "Silver", "cno" : "H413", "mfdcountry" : "San Franceco", "speed" : 55 } { "_id" : ObjectId("5471d72e0ce70a7026ebefee"), "name" : "Esteem", "color" : "JetRed", "cno" : "H414", "mfdcountry" : "Italy", "speed" : 65 } { "_id" : 1, "name" : "Polo", "color" : "White", "cno" : "H411", "mfdcountry" : "Germany", "speed" : 45 } { "_id" : 2, "name" : "Volkswagen", "color" : "Blue", "cno" : "H412", "mfdcountry" : "Japan", "speed" : 52 }
您会注意到,这会在名称字段上按升序对收车文件进行排序。
>db.car.find().sort({speed:-1,name:1}) { "_id" : ObjectId("54729a20ab36ed23e31c68f1"), "name" : "Audi", "color" : "Grey", "cno" : "H415", "mfdcountry" : "Rome", "speed" : 65 } { "_id" : ObjectId("5471d72e0ce70a7026ebefee"), "name" : "Esteem", "color" : "JetRed", "cno" : "H414", "mfdcountry" : "Italy", "speed" : 65 } { "_id" : ObjectId("5472988cab36ed23e31c68f0"), "name" : "skoda", "color" : "JetRed", "cno" : "H415", "mfdcountry" : "Chez", "speed" : 65 } { "_id" : 3, "name" : "Alto", "color" : "Silver", "cno" : "H413", "mfdcountry" : "San Franceco", "speed" : 55 } { "_id" : 2, "name" : "Volkswagen", "color" : "Blue", "cno" : "H412", "mfdcountry" : "Japan", "speed" : 52 } { "_id" : 1, "name" : "Polo", "color" : "White", "cno" : "H411", "mfdcountry" : "Germany", "speed" : 45 }
上面的示例基于速度对汽车集合进行降序排序,然后对具有相同速度的汽车按名称进行升序排序(65)。
限制MongoDB排序操作的结果
如果排序操作超过32兆字节,则MongoDB返回错误。
为了消除此错误,可以将索引与limit方法结合使用。
限制结果是要返回的32兆字节以内的文档数。
例如;
>db.car.find().sort( {speed:-1,name:1 }).limit(10)
此MongoDB排序操作将返回的文档数限制为10,并确保该数量在32 MB的范围内。
可以如下所示创建索引。
>db.car.ensureIndex({ name:1,speed:-1}) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 2, "numIndexesAfter" : 3, "ok" : 1 }
这样可以确保为汽车集合创建索引。
我们也可以使用Mongo shell的createIndex()方法。
指定投影字段
当用户指定要投影和排序的字段时,MongoDB引擎将首先对生成的文档进行排序。
例如;
>db.car.find({speed: { $gt:14}},{name:1,speed:1}).sort({"speed":-1}) { "_id" : 11, "name" : "Polo", "speed" : 45 } { "_id" : 10, "name" : "Volkswagen", "speed" : 44 } { "_id" : 9, "name" : "Skoda", "speed" : 43 } { "_id" : 12, "name" : "Ecosport", "speed" : 15 }
此操作首先按速度降序对汽车进行排序,然后在结果文档中仅显示id,名称和速度字段。
MongoDB排序的自然顺序
$natural参数按数据库中存在的顺序返回所有文档。
该顺序基本上描述了记录的插入顺序,但由于更新或者删除操作而导致文档重新定位的情况除外。
例如;
>db.car.find().sort( { $natural: 1 }) { "_id" : 9, "name" : "Skoda", "color" : "Red", "cno" : "H622", "mfdcountry" : "Chez", "speed" : 43 } { "_id" : 10, "name" : "Volkswagen", "color" : "Blue", "cno" : "H623", "mfdcountry" : "Germany", "speed" : 44 } { "_id" : 11, "name" : "Polo", "color" : "White", "cno" : "H624", "mfdcountry" : "Japan", "speed" : 45 } { "_id" : 12, "name" : "Ecosport", "color" : "NavyBlue", "cno" : "H625", "mfdcountry" : "Japan", "speed" : 15 }
按照将文档插入数据库的顺序来检索文档。
MongoDB排序Java程序
在本节中,我们将研究一个Java程序以升序和降序执行排序操作。
以下是针对Java驱动程序版本2.x的MongoDB排序程序。
package com.theitroad.mongodb; import java.net.UnknownHostException; import java.util.List; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.DBObject; import com.mongodb.MongoClient; public class MongoDBSort { //method for sorting in ascending order based on name public static void sortAscending() throws UnknownHostException { //Get a new connection to the db assuming that it is running MongoClient m1 = new MongoClient("localhost"); //use test as a datbase,use your database here DB d1 = m1.getDB("test"); //fetch the collection object ,car is used here,use your own DBCollection coll = d1.getCollection("car"); //find method is called and result stored in cursor DBCursor car = coll.find(); //sorting the cursor based in ascending order based on name field car.sort(new BasicDBObject("name", 1)); //iterating throug cursor and printing all the documents stored in //cursor try { while (car.hasNext()) { System.out.println(car.next()); } } finally { car.close(); } } //method for sorting in descending order based on speed public static void sortDescending() throws UnknownHostException { MongoClient m1 = new MongoClient("localhost"); DB d1 = m1.getDB("test"); DBCollection coll = d1.getCollection("car"); DBCursor car = coll.find(); //sorting the cursor based in descending order based on speed field car.sort(new BasicDBObject("speed", -1)); System.out .println("Sorts in Descending order-------------------------------------------"); try { while (car.hasNext()) { System.out.println(car.next()); } } finally { car.close(); } } //method for sorting in descending order based on speed and ascending order //based on name public static void sortDescendingAscending() throws UnknownHostException { MongoClient m1 = new MongoClient("localhost"); DB d1 = m1.getDB("test"); DBCollection coll = d1.getCollection("car"); DBCursor car = coll.find(); //sort speed in descending order then name in ascending order car.sort(new BasicDBObject("speed", -1).append("name", 1)); System.out .println("Combining two fields to sort in ascending and descending orders-----------------"); try { while (car.hasNext()) { System.out.println(car.next()); } } finally { car.close(); } } public static void sortlimit() throws UnknownHostException { MongoClient m1 = new MongoClient("localhost"); DB d1 = m1.getDB("test"); DBCollection coll = d1.getCollection("car"); DBObject q1 = new BasicDBObject("speed", new BasicDBObject("$gt", 15)); BasicDBObject fields = new BasicDBObject("name", 1).append("speed", 1); //find method is called and result stored //fetch the collection object //,car is used here,use your ownin cursor DBCursor car = coll.find(q1, fields); //sorting the cursor based in ascending order based on name field car.sort(new BasicDBObject("name", -1)).limit(2); System.out.println("limit--------------------------"); //iterating throug cursor and printing all the documents stored in //cursor try { while (car.hasNext()) { System.out.println(car.next()); } } finally { car.close(); } } public static void sortProjectionfields() throws UnknownHostException { MongoClient m1 = new MongoClient("localhost"); DB db = m1.getDB("test"); DBCollection col = db.getCollection("car"); DBObject query = new BasicDBObject("speed", new BasicDBObject("$gt", 40)); //fields with name and speed field is specified and only these fields //are displayed BasicDBObject fields = new BasicDBObject("name", 1).append("speed", 1); DBCursor carCursor1 = col.find(query, fields); System.out .println("------------------------------------------------------"); try { while (carCursor1.hasNext()) { System.out.println(carCursor1.next()); } } finally { carCursor1.close(); } } public static void sortnaturalordering() throws UnknownHostException { MongoClient m1 = new MongoClient("localhost"); DB d1 = m1.getDB("test"); DBCollection coll = d1.getCollection("car"); DBObject q1 = new BasicDBObject("speed", new BasicDBObject("$gt", 15)); BasicDBObject fields = new BasicDBObject("name", 1).append("speed", 1); //find method is called and result stored //fetch the collection object ,car is used here,use your own cursor DBCursor car = coll.find(q1, fields); //sorting the cursor based in ascending order based on name field car.sort(new BasicDBObject("$natural", -1)); System.out.println("natural ordering---------------"); //iterating through cursor and printing all the documents stored in //cursor try { while (car.hasNext()) { System.out.println(car.next()); } } finally { car.close(); } } public static void createIndex(String on, int type) throws UnknownHostException { MongoClient m1 = new MongoClient("localhost"); DB d1 = m1.getDB("test"); DBCollection coll = d1.getCollection("car"); coll.createIndex(new BasicDBObject(on, type)); System.out.println("created index---------------------"); List<DBObject> list = coll.getIndexInfo(); for (DBObject o : list) { System.out.println(o); } } public static void main(String[] args) throws UnknownHostException { //invoking methods for performing sorting sortAscending(); sortDescending(); sortDescendingAscending(); sortlimit(); sortProjectionfields(); sortnaturalordering(); createIndex("name", 1); } }
上面的程序导致以下输出。
{ "_id" : 3.0 , "name" : "Alto" , "color" : "Silver" , "cno" : "H413" , "mfdcountry" : "San Franceco" , "speed" : 55.0} { "_id" : { "$oid" : "5471d72e0ce70a7026ebefee"} , "name" : "Esteem" , "color" : "JetRed" , "cno" : "H414" , "mfdcountry" : "Italy" , "speed" : 65.0} { "_id" : 1.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "mfdcountry" : "Germany" , "speed" : 45.0} { "_id" : 2.0 , "name" : "Volkswagen" , "color" : "Blue" , "cno" : "H412" , "mfdcountry" : "Japan" , "speed" : 52.0} Sorting in Descending order------------------------------------------ { "_id" : { "$oid" : "5471d72e0ce70a7026ebefee"} , "name" : "Esteem" , "color" : "JetRed" , "cno" : "H414" , "mfdcountry" : "Italy" , "speed" : 65.0} { "_id" : 3.0 , "name" : "Alto" , "color" : "Silver" , "cno" : "H413" , "mfdcountry" : "San Franceco" , "speed" : 55.0} { "_id" : 2.0 , "name" : "Volkswagen" , "color" : "Blue" , "cno" : "H412" , "mfdcountry" : "Japan" , "speed" : 52.0} { "_id" : 1.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "mfdcountry" : "Germany" , "speed" : 45.0} sorting ascending descending---------------- { "_id" : { "$oid" : "54729a20ab36ed23e31c68f1"} , "name" : "Audi" , "color" : "Grey" , "cno" : "H415" , "mfdcountry" : "Rome" , "speed" : 65.0} { "_id" : { "$oid" : "5471d72e0ce70a7026ebefee"} , "name" : "Esteem" , "color" : "JetRed" , "cno" : "H414" , "mfdcountry" : "Italy" , "speed" : 65.0} { "_id" : { "$oid" : "5472988cab36ed23e31c68f0"} , "name" : "skoda" , "color" : "JetRed" , "cno" : "H415" , "mfdcountry" : "Chez" , "speed" : 65.0} { "_id" : 3.0 , "name" : "Alto" , "color" : "Silver" , "cno" : "H413" , "mfdcountry" : "San Franceco" , "speed" : 55.0} { "_id" : 2.0 , "name" : "Volkswagen" , "color" : "Blue" , "cno" : "H412" , "mfdcountry" : "Japan" , "speed" : 52.0} { "_id" : 1.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "mfdcountry" : "Germany" , "speed" : 45.0} limit------------------------- { "_id" : 10.0 , "name" : "Volkswagen" , "speed" : 44.0} { "_id" : 9.0 , "name" : "Skoda" , "speed" : 43.0} ----------------------------------------------------- { "_id" : 11.0 , "name" : "Polo" , "speed" : 45.0} { "_id" : 10.0 , "name" : "Volkswagen" , "speed" : 44.0} { "_id" : 9.0 , "name" : "Skoda" , "speed" : 43.0} natural ordering-------------- { "_id" : 11.0 , "name" : "Polo" , "speed" : 45.0} { "_id" : 10.0 , "name" : "Volkswagen" , "speed" : 44.0} { "_id" : 9.0 , "name" : "Skoda" , "speed" : 43.0} created index-------------------- { "v" : 1 , "key" : { "_id" : 1} , "name" : "_id_" , "ns" : "test.car"} { "v" : 1 , "key" : { "speed" : -1.0 , "name" : 1.0} , "name" : "speed_-1_name_1" , "ns" : "test.car"} { "v" : 1 , "key" : { "name" : 1.0 , "speed" : -1.0} , "name" : "name_1_speed_-1" , "ns" : "test.car"} { "v" : 1 , "key" : { "name" : 1} , "name" : "name_1" , "ns" : "test.car"}
如果您使用的是MongoDB Java驱动程序版本3.x,则以下代码应可用。
已通过3.5.0版进行测试
package com.theitroad.mongodb.main; import java.net.UnknownHostException; import java.util.List; import org.bson.Document; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.DBObject; import com.mongodb.MongoClient; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoCursor; import com.mongodb.client.MongoDatabase; public class MongoDBSort { //method for sorting in ascending order based on name public static void sortAscending() throws UnknownHostException { //Get a new connection to the db assuming that it is running MongoClient mc = new MongoClient("localhost"); //use test as a datbase,use your database here MongoDatabase db = mc.getDatabase("theitroad"); //fetch the collection object ,car is used here,use your own MongoCollection<Document> coll = db.getCollection("car"); //find method is called and result stored in cursor FindIterable<Document> car = coll.find(); //sorting the cursor based in ascending order based on name field car.sort(new BasicDBObject("name", 1)); //iterating through cursor and printing all the documents stored in cursor MongoCursor<Document> iterator = car.iterator(); try { while (iterator.hasNext()) { System.out.println(iterator.next()); } } finally { iterator.close(); mc.close(); } } //method for sorting in descending order based on speed public static void sortDescending() throws UnknownHostException { MongoClient mc = new MongoClient("localhost"); MongoDatabase db = mc.getDatabase("test"); MongoCollection<Document> coll = db.getCollection("car"); FindIterable<Document> car = coll.find(); //sorting the cursor based in descending order based on speed field car.sort(new BasicDBObject("speed", -1)); System.out.println("Sorts in Descending order"); MongoCursor<Document> iterator = car.iterator(); try { while (iterator.hasNext()) { System.out.println(iterator.next()); } } finally { iterator.close(); mc.close(); } } //method for sorting in descending order based on speed and ascending order //based on name public static void sortDescendingAscending() throws UnknownHostException { MongoClient mc = new MongoClient("localhost"); MongoDatabase db = mc.getDatabase("test"); MongoCollection<Document> coll = db.getCollection("car"); FindIterable<Document> car = coll.find(); //sort speed in descending order then name in ascending order car.sort(new BasicDBObject("speed", -1).append("name", 1)); System.out.println("Combining two fields to sort in ascending and descending orders"); MongoCursor<Document> iterator = car.iterator(); try { while (iterator.hasNext()) { System.out.println(iterator.next()); } } finally { iterator.close(); mc.close(); } } public static void sortlimit() throws UnknownHostException { MongoClient mc = new MongoClient("localhost"); MongoDatabase db = mc.getDatabase("test"); MongoCollection<Document> coll = db.getCollection("car"); BasicDBObject q1 = new BasicDBObject("speed", new BasicDBObject("$gt", 15)); //find method is called and result stored //fetch the collection object //,car is used here,use your ownin cursor FindIterable<Document> car = coll.find(q1); //sorting the cursor based in ascending order based on name field car.sort(new BasicDBObject("name", -1)).limit(2); System.out.println("limit example"); //iterating through cursor and printing all the documents stored in //cursor MongoCursor<Document> iterator = car.iterator(); try { while (iterator.hasNext()) { System.out.println(iterator.next()); } } finally { iterator.close(); mc.close(); } } public static void sortProjectionfields() throws UnknownHostException { MongoClient mc = new MongoClient("localhost"); MongoDatabase db = mc.getDatabase("test"); MongoCollection<Document> col = db.getCollection("car"); BasicDBObject query = new BasicDBObject("speed", new BasicDBObject("$gt", 40)); FindIterable<Document> carCursor1 = col.find(query); System.out.println("------------------------------------------------------"); MongoCursor<Document> iterator = carCursor1.iterator(); try { while (iterator.hasNext()) { System.out.println(iterator.next()); } } finally { iterator.close(); mc.close(); } } public static void sortnaturalordering() throws UnknownHostException { MongoClient mc = new MongoClient("localhost"); MongoDatabase db = mc.getDatabase("test"); MongoCollection<Document> coll = db.getCollection("car"); BasicDBObject q1 = new BasicDBObject("speed", new BasicDBObject("$gt", 15)); BasicDBObject fields = new BasicDBObject("name", 1).append("speed", 1); //find method is called and result stored //fetch the collection object ,car is used here,use your own cursor FindIterable<Document> car = coll.find(q1); //sorting the cursor based in ascending order based on name field car.sort(new BasicDBObject("$natural", -1)); System.out.println("natural ordering---------------"); //iterating through cursor and printing all the documents stored in //cursor MongoCursor<Document> iterator = car.iterator(); try { while (iterator.hasNext()) { System.out.println(iterator.next()); } } finally { iterator.close(); mc.close(); } } public static void createIndex(String on, int type) throws UnknownHostException { MongoClient mc = new MongoClient("localhost"); MongoDatabase db = mc.getDatabase("test"); MongoCollection<Document> coll = db.getCollection("car"); String indexName = coll.createIndex(new BasicDBObject(on, type)); System.out.println("created index name="+indexName); MongoCursor<Document> iterator = coll.listIndexes().iterator(); try { while (iterator.hasNext()) { System.out.println(iterator.next()); } } finally { iterator.close(); mc.close(); } } public static void main(String[] args) throws UnknownHostException { //invoking methods for performing sorting sortAscending(); sortDescending(); sortDescendingAscending(); sortlimit(); sortProjectionfields(); sortnaturalordering(); createIndex("name", 1); } }