在MongoDB中有兩種方式查詢數據庫裡的數據,即CURD查詢和聚合管道查詢。本章将對CURD查詢進行詳細講解。
準備數據
db.inventory.insertMany([
{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
{ item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
{ item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
{ item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
]);
查詢全部的inventory數據
db.inventory.find( {} ) //相當于select* from inventory
查詢item是paper的數據
db.inventory.find( { status: "D" } ) //條件就是在find中使用{ <field1>: <value1>, ... }進行匹配
結果:
多個條件and
db.inventory.find( { status: "A", qty: { $lt: 30 } } )//多個條件and即同時制定多個field
//上行語句中的$lt為操作符,意思是小于 整個條件的查詢為查詢
//select * from inventory where status =“A”and qty<30
多個條件or
db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } ) //使用$or操作符
既有and又有or的條件時
db.inventory.find( {
status: "A",
$or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]
} ) //mongo條過濾時支持正則 使用/ ^p/指item滿足以p開頭的 像sql中的like =“q%”
上邊是邏輯操作符的使用,接下來展示比較運算符的使用。
//等于$eq
{ field: <value> } //默認為等于 也可以寫成 { <field>: { $eq: <value> } }
//不等于$ne
db.inventory.find( { status: {$ne :"D" } })
//大于$gt 大于等于$gte 小于$lt 小于等于$lte 不等于 $ne
db.inventory.find( { qty: {$gt :12} } ) //查出qty大于12的文檔
//$in 同sql中的in意為滿足值在條件中的任意一個 $nin 意為not in
db.inventory.find( { status: {$in :["D","A"] } }) //查詢狀态是D 或者A的
除了關系數據庫有的邏輯運算符和比較運算符之外,mongo還有很多獨有的能力。Mongo可以查詢存在某個字段的或者不存在某個字段的文檔如下:
//插入一條數據
db.inventory.insertOne([
{ item: "journal2", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A",from:"Chinese"}
]);
//查詢文檔中含有from字段的文檔 我們使用$exists操作符就可以做到
db.inventory.find({ from{$exists: true }})
//這得益于Mongo的松散結構,我們的文檔不需要每個字段都一緻。
當我們使用嵌套的文檔格式時,還需要學習下面的查詢操作
//還是我們剛才準備的數據,查詢size 的寬是21 高是14的文檔
db.inventory.find( { "size.h": 14 },{ "size.w": 21 } ) //字段為對象類型時條件字段我們可以使用.來連接子屬性
我們的文檔還可以存儲數組類型的數據,數組類型的查詢我們接着看:
//我們再插入幾條數據
db.inventory.insertMany([
{ item: "journal", qty: 25, tags: ["blank", "red"], dim_cm: [ 14, 21 ] },
{ item: "notebook", qty: 50, tags: ["red", "blank"], dim_cm: [ 14, 21 ] },
{ item: "paper", qty: 100, tags: ["red", "blank", "plain"], dim_cm: [ 14, 21 ] },
{ item: "planner", qty: 75, tags: ["blank", "red"], dim_cm: [ 22.85, 30 ] },
{ item: "postcard", qty: 45, tags: ["blue"], dim_cm: [ 10, 15.25 ] }
]);
//查詢tags中包含red的文檔
db.inventory.find( { tags: "red" } )
///查詢tags同時含有 red和blank的文檔
db.inventory.find( { tags: { $all: ["red", "blank"] } } )
//查詢數組中包含的元素任意一個大于15且任意一個小于20的文檔滿足條件的可以不是同一個
db.inventory.find( { dim_cm: { $gt: 15, $lt: 20 } } )
//查詢數組中元素至少一個元素大于22小于30兩個條件都滿足
db.inventory.find( { dim_cm: { $elemMatch: { $gt: 22, $lt: 30 } } } )// $elemMatch過濾每個元素
//查詢數組中指定元素滿足條件的文檔
db.inventory.find( { "dim_cm.0": { $gt: 25 } } ) //查詢數組中第一個元素滿足條件的
//查詢數組的元素個數滿足條件的文檔
db.inventory.find( { "dim_cm": { $size: 25 } } )
下圖為執行結果:
查詢結果
上圖結果對比一下可以清晰理解$elemMatch和普通寫法的區别。
當數組中的元素是對象時我們可以參考下面的查詢操作:
//準備數據
db.inventory.insertMany( [
{ item: "journal", instock: [ { warehouse: "A", qty: 5 }, { warehouse: "C", qty: 15 } ] },
{ item: "notebook", instock: [ { warehouse: "C", qty: 5 } ] },
{ item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 15 } ] },
{ item: "planner", instock: [ { warehouse: "A", qty: 40 }, { warehouse: "B", qty: 5 } ] },
{ item: "postcard", instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] }
]);
//查詢數組對象中屬性滿足條件的文檔
db.inventory.find( { 'instock.qty': { $lte: 20 } } )
//查詢數組中指定元素的屬性滿足條件的文檔
db.inventory.find( { 'instock.0.qty': { $lte: 20 } } )
//數組中隻要一個元素滿足條件的文檔
db.inventory.find( { "instock": { qty: 5, warehouse: "A" } } )
//使用$elemMatch查詢數組中任意一個元素都滿足$elemMatch的條件
db.inventory.find( { "instock": { $elemMatch: { qty: { $gt: 10, $lte: 20 } } } } )
注意:db.inventory.find( { "instock": { qty: 5, warehouse: "A" } } )這個查詢中嵌套文檔的字段順序也要和條件相同才會查出來,這正好和上一張講的BSON文檔的字段是有序的對應了起來。
下章整理result的操作符和update API的講解。。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!