MongoDB的經常使用Query操做及操做符

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

1、經常使用Query 爲方便操做,在插入原數據前,先刪除全部文檔(在項目中請謹慎操做!):shell

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

0、查看全部文檔數組

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

一、對象查找 1.一、原數據bash

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.二、查找 size.h 等於 14,size.w 等於 21,size.uom 等於 cm 的文檔less

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

1.三、查找 size.uom 等於 in 的文檔工具

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

注意:當查找單個對象屬性時,務必加上引號!post

1.四、查找並返回對象裏的指定字段spa

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

1.五、查找並過濾對象裏的指定字段.net

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

二、數組查找 2.一、原數據3d

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.二、查找 tags=["red", "blank"] 的文檔

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

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

2.三、查找 tags 包含 red 的文檔

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

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


三、數組中包含對象的查找 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 } ] }
]);
複製代碼

3.二、查找數組中有一個對象符合條件的(不是包含),只要數組中有一個對象符合條件就返回整個數組

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

要嚴格按照字段的順序來,若是調換字段順序會 找 不 到,以下:

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

3.三、查找數組中的元素對象,有一個元素對象的qty=5,或者該對象(或者是其餘元素對象)的warehouse=A

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

3.四、查找數組中的對象,並返回對象的某個屬性

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

四、普通查找 4.一、原數據

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.二、查詢並返回指定字段 在 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.三、由 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 } )
複製代碼

會報錯

4.四、排除特定字段,返回其餘字段

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

五、查找 null 或不存在的 鍵 5.一、原數據

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

5.二、查找 item 爲 null 的文檔,或者不包含 item 的文檔

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

2、操做符 一、$lt less than 小於 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.二、查找 "size.h" 小於 15 的文檔集合

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

1.三、$lt 與 AND 聯用 查找 size.h 小於 15,而且 size.uom 是 in ,而且 status 是 D 的文檔

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

二、$lte less than equal 小於等於 2.一、原數據

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.二、查找 instock.qty 小於等於 20 的文檔,只要數組中有一個對象符合條件就返回整個數組

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

三、$gt greater than 大於 3.一、原數據

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.二、查找 dim_cm 大於 25 的文檔

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

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

3.三、查找 dim_cm 大於 15,或小於 20,或既大於 15,又小於 20 的文檔

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

3.四、查找 dim_cm 既大於 22,又小於 30 的文檔(是判斷數組的某一個元素是不是大於22,且小於30的,而不是判斷數組的全部元素)

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

3.五、根據數組位置查找 查找 dim_cm 的第二個元素 大於 25 的文檔

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

四、$size 根據數組長度查找 查找 tags 長度是 3 的文檔

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

五、$gte 大於等於 5.一、原數據

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.二、查找數組的第一個元素(對象)的qty 大於等於 20 的文檔集合

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

六、$elemMatch 對象的屬性匹配 6.一、在數組中查找符合 qty=5, warehouse="A" 的對象,並返回該文檔集合

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

6.二、在數組中查找符合 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 } } )
複製代碼

七、$slice 返回數組特定位置的元素 7.一、原數據

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.二、查找並返回 tags 數組的最後一個元素

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

結果:

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

八、$type 返回指定類型的元素 8.一、原數據

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

8.二、返回 null 類型的數據

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

類型以下:

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

九、$exists 返回存在/不存在的鍵 查找不存在 item 鍵的數據

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

十、$all 包含 10.一、原數據

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.二、查找 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…


(完)

相關文章
相關標籤/搜索