MongoDB的常用Query操作的介紹(附程式碼)

不言
發布: 2019-03-23 16:39:59
轉載
3613 人瀏覽過

這篇文章帶給大家的內容是關於MongoDB的常用Query操作的介紹(附程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

前言:使用的視覺化工具是Studio 3T,官網-->https://studio3t.com/
版本號:MongoDB shell version v3.4.2
如何使用:https:/ /blog.csdn.net/weixin_...
看點:重點看操作符那塊。
如何尋找:在此頁面按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操作的介紹(附程式碼)

详细文档请看:https://docs.mongodb.com/manu...

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查询的详细文档请看:https://docs.mongodb.com/manu...
Operator的详细文档请看:https://docs.mongodb.com/manu...

本篇文章到这里就已经全部结束了,更多其他精彩内容可以关注PHP中文网的mongodb视频教程栏目!

以上是MongoDB的常用Query操作的介紹(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:segmentfault.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!