mongodb 查詢條件,查詢邏輯對照表,邏輯運算子,正規表示式匹配查詢,排序,分頁/巧分頁,更新運算子,更新單個/多個文件,刪除文件,批次插入,$type運算子,ObjectId生成器,內嵌文件和陣列查詢修改

大树2發表於2024-10-21

mongodb 查詢條件,查詢邏輯對照表,邏輯運算子,正規表示式匹配查詢,排序,分頁/巧分頁,更新運算子,更新單個/多個文件,刪除文件,批次插入,$type運算子,內嵌文件和陣列查詢修改

1.條件查詢
SQL MQL
a = 1 {a: 1}
a <> 1 {a: {$ne: 1}}
a > 1 {a: {$gt: 1}}
a >= 1 {a: {$gte: 1}}
a < 1 {a: {$lt: 1}}
a <= 1 {a: {$lte: 1}}

2.查詢邏輯對照表
SQL MQL
a = 1 AND b = 1 {a: 1, b: 1}或{$and: [{a: 1}, {b: 1}]}
a = 1 OR b = 1 {$or: [{a: 1}, {b: 1}]}
a IS NULL {a: {$exists: false}}
a IN (1, 2, 3) {a: {$in: [1, 2, 3]}}

3.查詢邏輯運算子:
$lt: 存在並小於
$lte: 存在並小於等於
$gt: 存在並大於
$gte: 存在並大於等於
$ne: 不存在或存在但不等於
$in: 存在並在指定陣列中
$nin: 不存在或不在指定陣列中
$or: 匹配兩個或多個條件中的一個
$and: 匹配全部條件

4.例子:
1 #查詢帶有nosql標籤的book文件:
2 db.books.find({tag:"nosql"})
3 #按照id查詢單個book文件:
4 db.books.find({_id:ObjectId("61caa09ee0782536660494d9")})
5 #查詢分類為“travel”、收藏數超過60個的book文件:
6 db.books.find({type:"travel",favCount:{$gt:60}})

5.正規表示式匹配查詢
MongoDB 使用 $regex 運算子來設定匹配字串的正規表示式。
1 //使用正規表示式查詢type包含 so 字串的book
2 db.books.find({type:{$regex:"so"}})
3 //或者
4 db.books.find({type:/so/})

6.排序
在 MongoDB 中使用 sort() 方法對資料進行排序
1 #指定按收藏數(favCount)降序返回
2 db.books.find({type:"travel"}).sort({favCount:-1})
1 為升序排列,而 -1 是用於降序排列

7.分頁
skip用於指定跳過記錄數,limit則用於限定返回結果數量。可以在執行find命令的同時指定skip、limit引數,以此實現分頁的功能。
比如,假定每頁大小為8條,查詢第3頁的book文件:
db.books.find().skip(16).limit(8)
.skip(16) 表示跳過前面 16 條記錄,即前兩頁的所有記錄。
.limit(8) 表示返回 8 條記錄,即第三頁的所有記錄。

8.處理分頁問題 – 巧分頁
資料量大的時候,應該避免使用skip/limit形式的分頁。
替代方案:使用查詢條件+唯一排序條件;
例如:
第一頁:db.books.find({}).sort({_id: 1}).limit(10);
第二頁:db.books.find({_id: {$gt: <第一頁最後一個_id>}}).sort({_id: 1}).limit(10);
第三頁:db.books.find({_id: {$gt: <第二頁最後一個_id>}}).sort({_id: 1}).limit(10);

9.處理分頁問題 – 避免使用 count
儘可能不要計算總頁數,特別是資料量大和查詢條件不能完整命中索引時。
考慮以下場景:假設集合總共有 1000w 條資料,在沒有索引的情況下考慮以下查詢:
1 db.coll.find({x: 100}).limit(50);
2 db.coll.count({x: 100});
前者只需要遍歷前 n 條,直到找到 50 條 x=100 的文件即可結束;
後者需要遍歷完 1000w 條找到所有符合要求的文件才能得到結果。 為了計算總頁數而進行的 count() 往往是拖慢頁面整體載入速度的原因

10.MongoDB提供了以下方法來更新集合中的文件:
更新運算子
updateOne語法如下:
db.collection.updateOne ():即使多個文件可能與指定的篩選器匹配,也只會更新第一個匹配的文件。
db.collection.updateMany ():更新與指定篩選器匹配的所有文件。

11.運算子 格式 描述
$set {$set:{field:value}} 指定一個鍵並更新值,若鍵不存在則建立
$unset {$unset : {field : 1 }} 刪除一個鍵
$inc {$inc : {field : value } } 對數值型別進行增減
$rename {$rename : {old_field_name :new_field_name } } 修改欄位名稱
$push { $push : {field : value } } 將數值追加到陣列中,若陣列不存在則會進行初始化
$pushAll {$pushAll : {field : value_array}} 追加多個值到一個陣列欄位內
$pull {$pull : {field : _value } } 從陣列中刪除指定的元素
$addToSet {$addToSet : {field : value } } 新增元素到陣列中,具有排重功能
$pop {$pop : {field : 1 }} 刪除陣列的第一個或最後一個元素

12.更新單個/多個文件
db.books.updateOne({_id:ObjectId("642e62ec933c0dca8f8e9f60")},{$inc:{favCount:1}})

updateMany更新與集合的指定篩選器匹配的所有文件:
db.books.updateMany({type:"novel"},{$set:{publishedDate:new Date()}})

findAndModify
findAndModify相容了查詢和修改指定文件的功能,findAndModify只能更新單個文件
db.books.findAndModify({
query:{_id:ObjectId("642ec31813bdda928a1ea2a8")},
update:{$inc:{favCount:1}},
new: true //true返回修改後的資料,false返回修改前的舊資料
})

13.刪除文件
db.books.deleteOne ({ type:"novel" }) //刪除 type等於novel 的一個文件
db.books.deleteMany ({}) //刪除集合下全部文件
db.books.deleteMany ({ type:"novel" }) //刪除 type等於 novel 的全部文件
注意:remove、deleteMany命令需要對查詢範圍內的文件逐個刪除,如果希望刪除整個集合,則使用drop命令會更加高效

14.批次插入:
db.pizzas.insertMany( [ { _id: 0, type: "pepperoni", size: "small", price: 4 },
{ _id: 1, type: "cheese", size: "medium", price: 7 },
{ _id: 2, type: "vegan", size: "large", price: 8 } 5 ] )

15.$type運算子
$type運算子基於BSON型別來檢索集合中匹配的資料型別,並返回結果。
db.books.find({"title" : {$type : 2}})
//或者
db.books.find({"title" : {$type : "string"}})

16.ObjectId生成器
在預設情況下,_id欄位使用ObjectId型別,採用16進位制編碼形式,共12個位元組。
生成一個新的 ObjectId
1 db.dates.insertMany([{data1:Date()},{data2:new Date()},{data3:ISODate()}])
2 db.dates.find().pretty()
4.3 ObjectId生成器
4位元組表示Unix時間戳(秒)。
5位元組表示隨機數(機器號+程序號唯一)。
3位元組表示計數器(初始化時隨機)。

db.getCollection("orderItem").find({_id :{$gt:ObjectId("66f152405d660000ad00690d")}})

ObjectId("66f152405d660000ad00690d").getTimestamp() //2024-09-23 11:34:24.000
ObjectId("66f152405d660000ad00690d").str //66f152405d660000ad00690d
ObjectId("66f152405d660000ad00690d").toString() //ObjectId("66f152405d660000ad00690d")
ObjectId("66f152405d660000ad00690d").valueOf() //66f152405d660000ad00690d

17.內嵌文件和陣列
db.books.insert({
title: "撒哈拉的故事",
author: {
name:"三毛",
gender:"女",
hometown:"重慶"
}
})

db.books.find({"author.name":"三毛"})
db.books.updateOne({"author.name":"三毛"},{$set:{"author.hometown":"重慶/臺灣"}})
db.books.updateOne({"author.name":"三毛"},{$set:{tags:["旅行","隨筆","散文","愛情","文 學"]}}) //增加tags標籤
db.books.updateOne({"author.name":"三毛"},{$push:{tags:"獵奇"}}) //陣列末尾追加元素

相關文章