1. 程式人生 > >MongoDb 查詢詳解

MongoDb 查詢詳解

1、簡單的基本查詢

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

db.inventory.find({})     //查詢返回集合中的所有文件
db.inventory.findOne({})  //查詢返回單個文件
db.inventory.find( { status: { $in: [ "A", "D" ] } } )   //查詢status等於"A"或"D"的文件
!注意:雖然您可以使用$or運算子表達此查詢,但在對同一欄位執行相等性檢查時,請使用$in運算子而不是$or運算子。
db.inventory.find( { status: "A", qty: { $lt: 30 } } )   //查詢status等於"A", 並且qty小於30的文件
//查詢status等於"A", 並且qty小於30或者item的值以p開頭的文件
db.inventory.find( { status: "A", $or: [ { qty: { $lt: 30 } }, { item: /^p/ } ] } )

2、查詢嵌入/巢狀文件 、查詢陣列

要在嵌入/巢狀文件中的欄位上指定查詢條件,請使用點表示法

(使用點表示法,您可以為陣列的特定索引或位置處的元素指定查詢條件。該陣列使用從零開始的索引)

!注意:使用點表示法查詢時,欄位和巢狀欄位必須在引號內。 

db.inventory.insertMany([
   { item: "journal", qty: 25, tags: ["blank", "red"], dim_cm: [ 14, 21 ], 

size: { h: 14, w: 21, uom: "cm" } },
   { item: "notebook", qty: 50, tags: ["red", "blank"], dim_cm: [ 14, 21 ]
, size: { h: 8.5, w: 11, uom: "in" } },
   { item: "paper", qty: 100, tags: ["red", "blank", "plain"], dim_cm: [ 14, 21 ]
, size: { h: 8.5, w: 11, uom: "in" } },
   { item: "planner", qty: 75, tags: ["blank", "red"], dim_cm: [ 22.85, 30 ]
, size: { h: 22.85, w: 30, uom: "cm" } },
   { item: "postcard", qty: 45, tags: ["blue"], dim_cm: [ 10, 15.25 ]
, size: { h: 10, w: 15.25, uom: "cm" } }
]);

db.inventory.find( { "size.uom": "in" } )   //查詢size物件中的uom欄位等於"in"的文件
db.inventory.find( { "size.h": { $gt: 15 } } )   //查詢size物件中的h欄位大於15的文件
db.inventory.find( { tags: "red" } )   //查詢tags陣列中"red"作為其元素之一的文件
db.inventory.find( { tags: { $all: ["red", "blank"] } } )   //查詢tags陣列中的元素為"red"或"blank"的文件
//查詢dim_cm陣列中一個元素可以滿足大於15條件並且另一個元素可以滿足小於20條件,或者單個元素可以滿足兩個的文件
db.inventory.find( { dim_cm: { $gt: 15, $lt: 20 } } )   
//查詢dim_cm陣列中至少包含一個大於22和小於30的文件
db.inventory.find( { dim_cm: { $elemMatch: { $gt: 22, $lt: 30 } } } )   
db.inventory.find( { "dim_cm.1": { $gt: 25 } } )   //查詢dim_cm陣列中第二個元素大於25的文件
db.inventory.find( { "tags": { $size: 3 } } )   //查詢tags陣列的長度為3的文件

3、查詢嵌入式文件陣列

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

//查詢instock陣列中的warehouse為"A"的並且qty為5的文件  #注意這種查詢是完全匹配的,包括欄位順序也要一樣
db.inventory.find( { "instock": { warehouse: "A", qty: 5 } } )  
//查詢instock陣列中,qty欄位等於5並且warehouse欄位等於A的文件
db.inventory.find( { "instock": { $elemMatch: { qty: 5, warehouse: "A" } } } )
db.inventory.find( { 'instock.qty': { $lte: 20 } } )    //查詢instock陣列中的qty欄位值小於或等於20的文件
db.inventory.find( { 'instock.0.qty': { $lte: 20 } } )  //查詢instock陣列的第一個元素中的qty的值小於或等於20的文件
//查詢instock陣列中的qty等於5的並且warehouse等於"A"的文件
db.inventory.find( { "instock.qty": 5, "instock.warehouse": "A" } )   

預設情況下,MongoDB中的查詢返回匹配文件中的所有欄位。要限制MongoDB傳送到應用程式的資料量,可以包含投影文件以指定或限制要返回的欄位。例如:

//只能寫1或0, _id欄位預設都返回,需要主動指定_id:0 才會隱藏,需要返回什麼欄位,就( key : 1 )
db.inventory.find( { item: "journal" }, { instock: 1, _id: 0 } )