MongoDB的常用Query操作及操作符

進擊的小進進發表於2019-03-21

MongoDB的常用Query操作及操作符

前言:使用的視覺化工具是 Studio 3T,官網-->studio3t.com/ 版本號:MongoDB shell version v3.4.2 如何使用:blog.csdn.net/weixin_3999… 看點:重點看操作符那塊。 如何查詢:在此頁面按 ctrl+F 輸入關鍵字查詢

一、常用Query 為方便操作,在插入原資料前,先刪除所有文件(在專案中請謹慎操作!):

db.getCollection("inventory").deleteMany({})
複製程式碼

0、檢視所有文件

db.getCollection("inventory").find({})
複製程式碼

1、物件查詢 1.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" }
]);
複製程式碼

1.2、查詢 size.h 等於 14,size.w 等於 21,size.uom 等於 cm 的文件

db.inventory.find( { size: { h: 14, w: 21, uom: "cm" } } )
複製程式碼

1.3、查詢 size.uom 等於 in 的文件

db.inventory.find( { "size.uom": "in" } )
複製程式碼

注意:當查詢單個物件屬性時,務必加上引號!

1.4、查詢並返回物件裡的指定欄位

db.inventory.find(
   { status: "A" },
   { item: 1, status: 1, "size.uom": 1 }
)
複製程式碼

1.5、查詢並過濾物件裡的指定欄位

db.inventory.find(
   { status: "A" },
   { "size.uom": 0 }
)
複製程式碼

2、陣列查詢 2.1、原資料

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 ] }
]);
複製程式碼

2.2、查詢 tags=["red", "blank"] 的文件

db.inventory.find( { tags: ["red", "blank"] } )
複製程式碼

注意:不是包含關係,即 tags: ["red", "blank", "plain"] 是不包括在內的

2.3、查詢 tags 包含 red 的文件

db.inventory.find( { tags: "red" } )
複製程式碼

注意:不能這麼寫 db.inventory.find( { tags: ["red"] } ),這樣就表示查詢 tags 是 red 的文件


3、陣列中包含物件的查詢 3.1、原資料

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 } ] }
]);
複製程式碼

3.2、查詢陣列中有一個物件符合條件的(不是包含),只要陣列中有一個物件符合條件就返回整個陣列

db.inventory.find( { "instock": { warehouse: "A", qty: 5 } } )
複製程式碼

要嚴格按照欄位的順序來,如果調換欄位順序會 找 不 到,如下:

db.inventory.find( { "instock": { qty: 5, warehouse: "A" } } )
複製程式碼

3.3、查詢陣列中的元素物件,有一個元素物件的qty=5,或者該物件(或者是其他元素物件)的warehouse=A

db.inventory.find( { "instock.qty": 5, "instock.warehouse": "A" } )
複製程式碼

3.4、查詢陣列中的物件,並返回物件的某個屬性

db.inventory.find( { status: "A" }, { item: 1, status: 1, "instock.qty": 1 } )
複製程式碼

4、普通查詢 4.1、原資料

db.inventory.insertMany( [
  { item: "journal", status: "A", size: { h: 14, w: 21, uom: "cm" }, instock: [ { warehouse: "A", qty: 5 } ] },
  { item: "notebook", status: "A",  size: { h: 8.5, w: 11, uom: "in" }, instock: [ { warehouse: "C", qty: 5 } ] },
  { item: "paper", status: "D", size: { h: 8.5, w: 11, uom: "in" }, instock: [ { warehouse: "A", qty: 60 } ] },
  { item: "planner", status: "D", size: { h: 22.85, w: 30, uom: "cm" }, instock: [ { warehouse: "A", qty: 40 } ] },
  { item: "postcard", status: "A", size: { h: 10, w: 15.25, uom: "cm" }, instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] }
]);
複製程式碼

4.2、查詢並返回指定欄位 在 status=A 的條件下,返回 _id,item,status 欄位

db.inventory.find( { status: "A" }, { item: 1, status: 1 } )
複製程式碼

結果:

{ "_id" : ObjectId("5c91cd53e98d5972748780e1"), 
    "item" : "journal", 
    "status" : "A"}
// ----------------------------------------------
{ "_id" : ObjectId("5c91cd53e98d5972748780e2"), 
    "item" : "notebook", 
    "status" : "A"}
// ----------------------------------------------
{ "_id" : ObjectId("5c91cd53e98d5972748780e5"), 
    "item" : "postcard", 
    "status" : "A"}
複製程式碼

4.3、由 4.2 可知,_id 是自動帶著的,可以去掉,如下 查詢不帶(去掉) id :

db.inventory.find( { status: "A" }, { item: 1, status: 1, _id: 0 } )
複製程式碼

注意:除了 id 可以在過濾掉的同時,還去保留其他欄位外,其他欄位不能在 0 的同時,還寫 1 如:

db.inventory.find( { status: "A" }, { item: 1, status: 0 } )
複製程式碼

會報錯

MongoDB的常用Query操作及操作符

4.4、排除特定欄位,返回其他欄位

db.inventory.find( { status: "A" }, { status: 0, instock: 0 } )
複製程式碼

5、查詢 null 或不存在的 鍵 5.1、原資料

db.inventory.insertMany([
   { _id: 1, item: null },
   { _id: 2 }
])
複製程式碼

5.2、查詢 item 為 null 的文件,或者不包含 item 的文件

db.inventory.find( { item: null } )
複製程式碼

二、操作符 1、$lt less than 小於 1.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" }
]);
複製程式碼

1.2、查詢 "size.h" 小於 15 的文件集合

db.inventory.find( { "size.h": { $lt: 15 } } )
複製程式碼

1.3、$lt 與 AND 聯用 查詢 size.h 小於 15,並且 size.uom 是 in ,並且 status 是 D 的文件

db.inventory.find( { "size.h": { $lt: 15 }, "size.uom": "in", status: "D" } )
複製程式碼

2、$lte less than equal 小於等於 2.1、原資料

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 } ] }
]);
複製程式碼

2.2、查詢 instock.qty 小於等於 20 的文件,只要陣列中有一個物件符合條件就返回整個陣列

db.inventory.find( { 'instock.qty': { $lte: 20 } } )
複製程式碼

3、$gt greater than 大於 3.1、原資料

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 ] }
]);
複製程式碼

3.2、查詢 dim_cm 大於 25 的文件

db.inventory.find( { dim_cm: { $gt: 25 } } )
複製程式碼

注意:只要包含大於 25 的元素的陣列,都是符合條件的

3.3、查詢 dim_cm 大於 15,或小於 20,或既大於 15,又小於 20 的文件

db.inventory.find( { dim_cm: { $gt: 15, $lt: 20 } } )
複製程式碼

3.4、查詢 dim_cm 既大於 22,又小於 30 的文件(是判斷陣列的某一個元素是否是大於22,且小於30的,而不是判斷陣列的所有元素)

db.inventory.find( { dim_cm: { $elemMatch: { $gt: 22, $lt: 30 } } } )
複製程式碼

3.5、根據陣列位置查詢 查詢 dim_cm 的第二個元素 大於 25 的文件

db.inventory.find( { "dim_cm.1": { $gt: 25 } } )
複製程式碼

4、$size 根據陣列長度查詢 查詢 tags 長度是 3 的文件

db.inventory.find( { "tags": { $size: 3 } } )
複製程式碼

5、$gte 大於等於 5.1、原資料

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 } ] }
]);
複製程式碼

5.2、查詢陣列的第一個元素(物件)的qty 大於等於 20 的文件集合

db.inventory.find( { 'instock.0.qty': { $gte: 20 } } )
複製程式碼

6、$elemMatch 物件的屬性匹配 6.1、在陣列中查詢符合 qty=5, warehouse="A" 的物件,並返回該文件集合

db.inventory.find( { "instock": { $elemMatch: { qty: 5, warehouse: "A" } } } )
複製程式碼

6.2、在陣列中查詢符合 qty 大於 10 並且小於等於 20 的文件集合

db.inventory.find( { "instock": { $elemMatch: { qty: { $gt: 10, $lte: 20 } } } } )
複製程式碼

如果不使用 $elemMatch 的話,就表示 qty 大於 10 或者小於等於 20,官方文件意思是,不在陣列的某一個元素找 既滿足條件 A 又滿足條件 B 的 qty,而是在陣列的所有元素上找,滿足條件 A 或滿足條件 B 的 qty

db.inventory.find( { "instock.qty": { $gt: 10,  $lte: 20 } } )
複製程式碼

7、$slice 返回陣列特定位置的元素 7.1、原資料

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 ] }
]);
複製程式碼

7.2、查詢並返回 tags 陣列的最後一個元素

db.inventory.find( { item: "journal" }, { item: 1, qty: 0, tags: { $slice: -1 } } )
複製程式碼

結果:

{ 
    "_id" : ObjectId("5c91dce5e98d5972748780e6"), 
    "item" : "journal", 
    "tags" : [
        "red"
    ]
}
複製程式碼

8、$type 返回指定型別的元素 8.1、原資料

db.inventory.insertMany([
   { _id: 1, item: null },
   { _id: 2 }
])
複製程式碼

8.2、返回 null 型別的資料

db.inventory.find( { item : { $type: 10 } } )
複製程式碼

型別如下:

MongoDB的常用Query操作及操作符

詳細文件請看:docs.mongodb.com/manual/refe…

9、$exists 返回存在/不存在的鍵 查詢不存在 item 鍵的資料

db.inventory.find( { item : { $exists: false } } )
複製程式碼

10、$all 包含 10.1、原資料

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 ] }
]);
複製程式碼

10.2、查詢 tags 陣列包含 ["red", "blank"] 的文件

db.inventory.find( { tags: { $all: ["red", "blank"] } } )
複製程式碼

綜上: 陣列用的:$all$size$slice 物件用的:$elemMatch

Query查詢的詳細文件請看:docs.mongodb.com/manual/tuto… Operator的詳細文件請看:docs.mongodb.com/manual/refe…


MongoDB的常用Query操作及操作符

(完)

相關文章