iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 16
0
AI & Data

從入門到精通 MongoDB系列 第 16

Day16: 進階的 CRUD 操作(6) - sort(), limit(), skip()

我們在之前都會使用 find() 來檢視或查詢資料,但有時候我們會想要針對回傳的結果進行一些處理,例如:排序、數量限制、翻頁效果等,就會使用到今天要介紹的這三個方法:sort()limit()skip()


sort()

我們可以使用 sort() 對查詢結果進行排序:

範例1:將 movie.json 依 imdb_score 由小到大排序

  • db.movie.find().sort({imdb_score: 1})
    • {imdb_score: 1} 表示依 imdb_score 由小到大排序
    • 若排序的比較值相同,則依資料插入的先後順序進行排序

範例2:將 movie.json 依 imdb_score 由小到大,且片長也從小到大排序

  • db.movie.find().sort({imdb_score: 1, duration: 1})
    • 先依照 imdb_score 由小到大排序,再依照 duration 由小到大排序

範例3:將 movie.json 依 imdb_score 由大到小排序

  • db.movie.find().sort({imdb_score: -1})
    • {imdb_score: -1} 表示依 imdb_score 由大到小排序

limit()

我們使用 find() 查詢時回傳結果預設只會回傳前 20 筆資料,需輸入 "it" 進行翻頁才能看到接續的結果:
我們也可以使用 limit() 來設定回傳的資料數量,例如我們想要回傳評分最低的 10 部電影:db.movie.find().sort({imdb_score: 1}).limit(10)


skip()

上面提到使用 find() 查詢時回傳結果預設只會回傳前 20 筆資料,需輸入 "it" 進行翻頁才能看到接續的結果,我們也可以使用 skip() 來直接選擇回傳的頁數。
例如:我們想要查看評分最低的前 3 部電影,可以使用以下指令:db.movie.find().sort({imdb_score: 1}).limit(3)

但如果想要查看評分第 4 低到第 6 低的電影,則可以使用 limit(3).skip(3) 來省略前 3 筆資料:db.movie.find().sort({imdb_score: 1}).limit(3).skip(3)

同理,如果想要查看評分第 7 低到第 9 低的電影,則可以使用 limit(3).skip(6) 來省略前 6 筆資料:db.movie.find().sort({imdb_score: 1}).limit(3).skip(6)


進階排序

我們使用 find() 查詢資料時回傳的結果是按照原先資料的新增順序:db.movie.find().limit(3)

我們如果想要對 find() 的結果進行排序,可能會想到使用以下的指令:db.movie.find().limit(3).sort({imdb_score:1})

  • 我們從上圖的結果發現,回傳的結果和一開始使用 limit(3) 的資料不同,那是因為我們使用 find().limit().sort() 的方法會針對 find() 的所有結果進行排序,而不是針對 limit() 後的結果排序。

如果想要對 limit() 後的結果進行排序,則需要使用 聚合 Aggregation 的方法來完成:db.movie.aggregate([{$limit: 3} , {$sort: {imdb_score: 1}}])


今天介紹了幾種對 find() 的回傳結果進行操作的方法,下一篇將會介紹關於 update 更新操作的進階方法。


上一篇
Day15: 進階的 CRUD 操作(5) - Array 相關查詢運算子
下一篇
Day17: 進階的 CRUD 操作(7) - updateOne(), updateMany(), $set, $unset, $rename
系列文
從入門到精通 MongoDB26

尚未有邦友留言

立即登入留言