《MongoDB入门教程》第12篇 查询结果排序
本篇將會介紹 MongoDB 中的游標 sort() 方法,實現(xiàn)查詢結(jié)果的排序功能。
sort() 方法
sort() 方法可以為查詢返回的文檔指定指定一個顯示順序:
cursor.sort({field1: order, field2: order, ...})sort() 方法支持多字段排序,每個字段都可以指定升序或者降序排序。
{ field: 1 } 表示按照字段的升序排序:
cursor.sort({ field: 1 }){ field: -1} 表示按照字段的降序排序:
cursor.sort({field: -1})下面的語法表示先按照字段 field1 的升序排序,然后再按照字段 field2 的降序排序:
cursor.sort({field1: 1, field2: -1});相同類型的數(shù)據(jù)比較很簡單,但是不同 BSON 類型的數(shù)據(jù)比較略微有些復(fù)雜。
MongoDB 使用以下從小到大的順序比較不同的 BSON 類型:
更多詳細信息可以參考官方文檔。
sort() 示例
接下來我們將會使用以下 products 集合演示 sort() 方法的使用。
db.products.insertMany([{ "_id" : 1, "name" : "xPhone", "price" : 799, "releaseDate" : ISODate("2011-05-14T00:00:00Z"), "spec" : { "ram" : 4, "screen" : 6.5, "cpu" : 2.66 }, "color" : [ "white", "black" ], "storage" : [ 64, 128, 256 ] },{ "_id" : 2, "name" : "xTablet", "price" : 899, "releaseDate" : ISODate("2011-09-01T00:00:00Z"), "spec" : { "ram" : 16, "screen" : 9.5, "cpu" : 3.66 }, "color" : [ "white", "black", "purple" ], "storage" : [ 128, 256, 512 ] },{ "_id" : 3, "name" : "SmartTablet", "price" : 899, "releaseDate" : ISODate("2015-01-14T00:00:00Z"), "spec" : { "ram" : 12, "screen" : 9.7, "cpu" : 3.66 }, "color" : [ "blue" ], "storage" : [ 16, 64, 128 ] },{ "_id" : 4, "name" : "SmartPad", "price" : 699, "releaseDate" : ISODate("2020-05-14T00:00:00Z"), "spec" : { "ram" : 8, "screen" : 9.7, "cpu" : 1.66 }, "color" : [ "white", "orange", "gold", "gray" ], "storage" : [ 128, 256, 1024 ] },{ "_id" : 5, "name" : "SmartPhone", "price" : 599, "releaseDate" : ISODate("2022-09-14T00:00:00Z"), "spec" : { "ram" : 4, "screen" : 9.7, "cpu" : 1.66 }, "color" : [ "white", "orange", "gold", "gray" ], "storage" : [ 128, 256 ] },{ "_id" : 6, "name" : "xWidget", "spec" : { "ram" : 64, "screen" : 9.7, "cpu" : 3.66 }, "color" : [ "black" ], "storage" : [ 1024 ] },{ "_id" : 7, "name" : "xReader", "price" : null, "spec" : { "ram" : 64, "screen" : 6.7, "cpu" : 3.66 }, "color" : [ "black", "white" ], "storage" : [ 128 ] } ])示例一:單個字段排序
下面的查詢返回了所有存在 price 字段的文檔,返回的字段包含 _id、name 以及 price:
db.products.find({'price': {$exists: 1} }, {name: 1,price: 1 })輸出結(jié)果如下:
[{ _id: 1, name: 'xPhone', price: 799 },{ _id: 2, name: 'xTablet', price: 899 },{ _id: 3, name: 'SmartTablet', price: 899 },{ _id: 4, name: 'SmartPad', price: 699 },{ _id: 5, name: 'SmartPhone', price: 599 },{ _id: 7, name: 'xReader', price: null } ]如果想要按照價格從低到高對返回的結(jié)果進行排序,可以使用以下 sort() 方法:
db.products.find({'price': {$exists: 1} }, {name: 1,price: 1 }).sort({price: 1 })輸出結(jié)果如下:
[{ _id: 7, name: 'xReader', price: null },{ _id: 5, name: 'SmartPhone', price: 599 },{ _id: 4, name: 'SmartPad', price: 699 },{ _id: 1, name: 'xPhone', price: 799 },{ _id: 2, name: 'xTablet', price: 899 },{ _id: 3, name: 'SmartTablet', price: 899 } ]以上示例中,價格為空的產(chǎn)品排在最前面,然后依次從低到高進行排列。
如果想要按照價格從高到低進行排序,可以將 sort() 方法中的 price 字段設(shè)置為 -1:
db.products.find({'price': {$exists: 1} }, {name: 1,price: 1 }).sort({price: -1 })返回結(jié)果如下:
[{ _id: 2, name: 'xTablet', price: 899 },{ _id: 3, name: 'SmartTablet', price: 899 },{ _id: 1, name: 'xPhone', price: 799 },{ _id: 4, name: 'SmartPad', price: 699 },{ _id: 5, name: 'SmartPhone', price: 599 },{ _id: 7, name: 'xReader', price: null } ]示例二:多個字段排序
以下示例使用 sort() 方法按照 name 和 price 字段從小到大的順序?qū)Σ樵兘Y(jié)果進行排序:
db.products.find({'price': {$exists: 1} }, {name: 1,price: 1 }).sort({price: 1,name: 1 });輸出結(jié)果如下:
[{ _id: 7, name: 'xReader', price: null },{ _id: 5, name: 'SmartPhone', price: 599 },{ _id: 4, name: 'SmartPad', price: 699 },{ _id: 1, name: 'xPhone', price: 799 },{ _id: 3, name: 'SmartTablet', price: 899 },{ _id: 2, name: 'xTablet', price: 899 } ]在以上示例中,sort() 方法首先按照價格進行排序,然后對價格相同的結(jié)果再按照名稱進行排序。_id 為 3 和 2 的產(chǎn)品價格相同,都是 899;它們按照名稱進行升序排列,SmartTablet 排在了 xTablet 之前。
以下示例按照價格升序、名稱降序的方式對返回的產(chǎn)品進行排序:
db.products.find({'price': {$exists: 1} }, {name: 1,price: 1 }).sort({price: 1,name: -1 })Code language: PHP (php)
Output:
此時,xTable 排在了 SmartTablet 之前。
示例三:基于日期排序
以下示例按照日期字段 releaseDate 對 products 集合中的文檔進行排序,查詢只返回了存在 releaseDate 字段的文檔,并且只返回了 _id、name 以及 releaseDate 字段:
db.products.find({releaseDate: {$exists: 1}}, {name: 1,releaseDate: 1 }).sort({releaseDate: 1 });查詢返回的結(jié)果如下:
[{_id: 1,name: 'xPhone',releaseDate: ISODate("2011-05-14T00:00:00.000Z")},{_id: 2,name: 'xTablet',releaseDate: ISODate("2011-09-01T00:00:00.000Z")},{_id: 3,name: 'SmartTablet',releaseDate: ISODate("2015-01-14T00:00:00.000Z")},{_id: 4,name: 'SmartPad',releaseDate: ISODate("2020-05-14T00:00:00.000Z")},{_id: 5,name: 'SmartPhone',releaseDate: ISODate("2022-09-14T00:00:00.000Z")} ]示例四:基于嵌入字段排序
以下示例使用嵌入式文檔 spec 中的 ram 字段對產(chǎn)品進行排序:
db.products.find({}, {name: 1,spec: 1 }).sort({"spec.ram": 1 });輸出結(jié)果如下:
[{ _id: 1, name: 'xPhone', spec: { ram: 4, screen: 6.5, cpu: 2.66 } },{_id: 5,name: 'SmartPhone',spec: { ram: 4, screen: 9.7, cpu: 1.66 }},{_id: 4,name: 'SmartPad',spec: { ram: 8, screen: 9.7, cpu: 1.66 }},{_id: 3,name: 'SmartTablet',spec: { ram: 12, screen: 9.7, cpu: 3.66 }},{_id: 2,name: 'xTablet',spec: { ram: 16, screen: 9.5, cpu: 3.66 }},{_id: 6,name: 'xWidget',spec: { ram: 64, screen: 9.7, cpu: 3.66 }},{_id: 7,name: 'xReader',spec: { ram: 64, screen: 6.7, cpu: 3.66 }} ]總結(jié)
以上是生活随笔為你收集整理的《MongoDB入门教程》第12篇 查询结果排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 监控神器Prometheus,开箱即用!
- 下一篇: 计算机软件网络工程报名,网络工程师如何报