日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《MongoDB入门教程》第12篇 查询结果排序

發布時間:2024/3/26 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《MongoDB入门教程》第12篇 查询结果排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本篇將會介紹 MongoDB 中的游標 sort() 方法,實現查詢結果的排序功能。

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});

相同類型的數據比較很簡單,但是不同 BSON 類型的數據比較略微有些復雜。

MongoDB 使用以下從小到大的順序比較不同的 BSON 類型:

  • MinKey(內部類型)
  • 空類型
  • 數字(整數、長整數、雙精度浮點數、十進制數字)
  • 符號、字符串
  • 對象
  • 數組
  • BinData
  • ObjectId
  • 布爾類型
  • 日期
  • 時間戳
  • 正則表達式
  • MaxKey(內部類型)
  • 更多詳細信息可以參考官方文檔。

    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 })

    輸出結果如下:

    [{ _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 } ]

    如果想要按照價格從低到高對返回的結果進行排序,可以使用以下 sort() 方法:

    db.products.find({'price': {$exists: 1} }, {name: 1,price: 1 }).sort({price: 1 })

    輸出結果如下:

    [{ _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 } ]

    以上示例中,價格為空的產品排在最前面,然后依次從低到高進行排列。

    如果想要按照價格從高到低進行排序,可以將 sort() 方法中的 price 字段設置為 -1:

    db.products.find({'price': {$exists: 1} }, {name: 1,price: 1 }).sort({price: -1 })

    返回結果如下:

    [{ _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 字段從小到大的順序對查詢結果進行排序:

    db.products.find({'price': {$exists: 1} }, {name: 1,price: 1 }).sort({price: 1,name: 1 });

    輸出結果如下:

    [{ _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() 方法首先按照價格進行排序,然后對價格相同的結果再按照名稱進行排序。_id 為 3 和 2 的產品價格相同,都是 899;它們按照名稱進行升序排列,SmartTablet 排在了 xTablet 之前。

    以下示例按照價格升序、名稱降序的方式對返回的產品進行排序:

    db.products.find({'price': {$exists: 1} }, {name: 1,price: 1 }).sort({price: 1,name: -1 })

    Code language: PHP (php)
    Output:

    [{ _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 } ]

    此時,xTable 排在了 SmartTablet 之前。

    示例三:基于日期排序

    以下示例按照日期字段 releaseDate 對 products 集合中的文檔進行排序,查詢只返回了存在 releaseDate 字段的文檔,并且只返回了 _id、name 以及 releaseDate 字段:

    db.products.find({releaseDate: {$exists: 1}}, {name: 1,releaseDate: 1 }).sort({releaseDate: 1 });

    查詢返回的結果如下:

    [{_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 字段對產品進行排序:

    db.products.find({}, {name: 1,spec: 1 }).sort({"spec.ram": 1 });

    輸出結果如下:

    [{ _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 }} ]

    總結

    以上是生活随笔為你收集整理的《MongoDB入门教程》第12篇 查询结果排序的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。