基礎查詢
正則查詢
{status: 'A',$or: [{ qty: { $lt: 30 } }, { item: { $regex: '^p' } }]
}
AND 查詢
{ "size.h": { $lt: 15 }, "size.uom": "in", status: "D" }
OR 查詢
{ $or: [ { status: "A" }, { qty: { $lt: 30 } } ] }
AND 和 OR 混合
{ status: "A", $or: [ { qty: { $lt: 30 } }, { item: /^p/ } ] }
嵌套對象查詢
用點號來查詢嵌套字段
這種方式寫的帶點號的字段必須包含在雙引號之中
{ "size.h": { $lt: 15 } }
{ "size.uom": "in" }
匹配嵌套文檔對象
注意?這種查詢方式是字段順序相關的,也就是說:
{item: 'journal',qty: 25,size: { h: 14, w: 21, uom: 'cm' },status: 'A'
},// 查得到數據
{ size: { h: 14, w: 21, uom: "cm" } }// 查不到數據
{ size: { w: 21, h: 14, uom: "cm" } }
數組查詢
數組類型的匹配查詢時,也是順序相關的
{ tags: ["red", "blank"] }
// 查詢到不一樣的結果
{ tags: ["blank", "red"] }
查詢一個數組值中包含指定的復數成員, 順序無關
{ tags: { $all: ["red", "blank"] } }
查詢一個數組中是否至少包含一個指定的成員
// tags 是一個數組,查詢是否有成員 red
{ tags: "red" }
查詢文檔中所有記錄的 dim_cm
數組,獲取其中至少有一個成員值大于 25 的記錄
{ dim_cm: { $gt: 25 } }
比較特殊的樣例, 當數組值查詢時, 數組中任一成員滿足其中一個條件,就會被認定為符合條件
{ dim_cm: { $gt: 15, $lt: 20 } }
比如這一條,只要 dim_cm
中有成員值大于 15 或者小于 20,本條記錄就會被返回。而不是直覺上的同時滿足大于 15 和小于 20
使用 $elemMatch
來完成復數條件查詢
上面的反例,想要查詢任一成員同時滿足多個條件的數組時,需要用 $elemMatch
{ dim_cm: { $elemMatch: { $gt: 22, $lt: 30 } } }
對比剛剛的查詢,結果數變少了
對固定位置的元素進行查詢
使用前面嵌套字段查詢提到的 .
操作符,可以對數組字段中指定位置的元素值進行查詢
{ "dim_cm.1": { $gt: 25 } }
指定數組的長度條件
查詢 tags
的成員數等于 3 的記錄
{ "tags": { $size: 3 } }
對象數組的查詢
成員值完全匹配查詢
查詢成員字段 warehouse = ‘A’ 和 qty = 5 的記錄,順序相關
{ "instock": { warehouse: "A", qty: 5 } }
對成員中的某個字段查詢
.
操作符的使用
查詢 instock 成員中 qty >= 20 的記錄
{ 'instock.qty': { $lte: 20 } }
對固定位置的成員進行查詢
{ 'instock.0.qty': { $gt: 10, $lte: 20 } }
查詢至少一個成員滿足復數條件的文檔
使用 $elemMatch
可以進行復數條件查詢,順序無關。前面沒有使用 $elemMatch
就是值查詢,是順序相關的。
{ "instock": { $elemMatch: { qty: 5, warehouse: "A" } } }
查詢成員滿足任意條件的文檔
會查出有成員 qty > 10 或者 qty <= 20 的文檔
{ "instock.qty": { $gt: 10, $lte: 20 } }
另一個樣例:
這里也是只要有成員滿足這兩個條件之一,這條記錄就會被查到,不必要有一個成員同時滿足兩個條件。
{ "instock.qty": 5, "instock.warehouse": "A" }
查詢成員字段同時滿足多個條件
這個例子官方文檔沒有提到, 和上面的對比是現在至少一個成員的 qty 值要同時滿足兩個條件才會被查到
{ "instock": { $elemMatch: { qty: { $gt: 10, $lte: 20 } } } }
總結一下的點操作符用到的場景
- 嵌套對象字段查詢
{ "size.h": { $lt: 15 } }
{ "size.uom": "in" }
- 數組固定位置的元素進行查詢
{ "dim_cm.1": { $gt: 25 } }
- 對象數組中對成員字段進行查詢
{ 'instock.qty': { $lte: 20 } }
- 對象數組中對固定位置的成員進行查詢
{ 'instock.0.qty': { $gt: 10, $lte: 20 } }
Project 返回你想要的字段
基礎使用
在填寫 project 的地方傳入下面的對象,返回的記錄中就只會有 item
,status
和一個默認的 _id
字段
{ item: 1, status: 1 }
刪除 _id
不想要 _id
就在 project 里面給個 0 值就行
{ item: 1, status: 1, _id: 0 }
上面的語句同時使用了 1
來標記需要展示字段,和 0
來刪除 _id
,這種用法僅限于 _id
字段
僅刪除不需要的字段
有時需要顯示的字段很多,不需要的很少,可以僅用 0
刪除不需要的字段。
{ status: 0, instock: 0 }
嵌套對象的 Project
就用前面學到的 .
操作符就好了
{ item: 1, status: 1, "size.uom": 1 }
僅刪除不要字段也是給個 0
就行
{ "size.uom": 0 }
對象數組中的 Project
返回結果的 instock 數組成員僅有 qty 字段
{ item: 1, status: 1, "instock.qty": 1 }
數組元素的 Project
- $elemMatch
對數組元素的 Project 會復雜一些,官方提供了三種操作:
$elemMatch
, $slice
, $
首先是前面見得比較多的 $elemMatch
, 當這個從操作出現在 Project 里面時,就是對數組字段的成員進行篩選,返回符合條件第一個成員。
{"students": { $elemMatch: { age: { $gte: 10, $lte: 20 } } }}
- $slice
對數組成員進行切片,三種語法
$slice: 正數
返回數組的前 2 個成員
{"students": { $slice: 2 }}
$slice: 負數
返回數組的后 2 個成員
{"students": { $slice: -2 }}
$slice: [n, m]
先跳過數組的前 n 個成員,再返回 m 個成員
{"students": {$slice: [1, 2]}}
$
這個符號需要在查詢時有對數組字段附加了查詢條件,這樣就可以在 Project 時用這個符號來返回符合查詢條件的第一個成員
query: {zipcode: "63109", "students.age": { $gt: 10 }}
project: {"students.$": 1}
管道 Aggregation (持續更新,創作中)
管道可以說是 MongoDB 最核心的東西了。
$unwind
對一個數組字段 $unwind, 就會將數組的每個成員當成輸入,然后根據情況不斷替換原來的數組字段,并產生一個新的文檔
舉例:
{ "_id" : 1, "item" : "ABC1", sizes: [ "S", "M", "L"] }
對 sizes 進行 $unwind
db.inventory.aggregate( [ { $unwind : "$sizes" } ] )
得到結果:
原本的數組成員被展開了,分別替換原來的數組字段形成新的文檔
{ "_id" : 1, "item" : "ABC1", "sizes" : "S" }
{ "_id" : 1, "item" : "ABC1", "sizes" : "M" }
{ "_id" : 1, "item" : "ABC1", "sizes" : "L" }