Linux平台下的MongoDB基礎

語言: CN / TW / HK

MongoDB簡介

MongoDB 是由C++語言編寫的,是一個基於分佈式文件存儲的開源數據庫系統。

在高負載的情況下,添加更多的節點,可以保證服務器性能。

MongoDB 旨在為WEB應用提供可擴展的高性能數據存儲解決方案。

MongoDB 將數據存儲為一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔類似於 JSON 對象。字段值可以包含其他文檔,數組及文檔數組。

img

主要特點

  • MongoDB 是一個面向文檔存儲的數據庫,操作起來比較簡單和容易。
  • 你可以在MongoDB記錄中設置任何屬性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")來實現更快的排序。
  • 你可以通過本地或者網絡創建數據鏡像,這使得MongoDB有更強的擴展性。
  • 如果負載的增加(需要更多的存儲空間和更強的處理能力) ,它可以分佈在計算機網絡中的其他節點上這就是所謂的分片。
  • Mongo支持豐富的查詢表達式。查詢指令使用JSON形式的標記,可輕易查詢文檔中內嵌的對象及數組。
  • MongoDb 使用update()命令可以實現替換完成的文檔(數據)或者一些指定的數據字段 。
  • Mongodb中的Map/reduce主要是用來對數據進行批量處理和聚合操作。
  • Map和Reduce。Map函數調用emit(key,value)遍歷集合中所有的記錄,將key與value傳給Reduce函數進行處理。
  • Map函數和Reduce函數是使用Javascript編寫的,並可以通過db.runCommand或mapreduce命令來執行MapReduce操作。
  • GridFS是MongoDB中的一個內置功能,可以用於存放大量小文件。
  • MongoDB允許在服務端執行腳本,可以用Javascript編寫某個函數,直接在服務端執行,也可以把函數的定義存儲在服務端,下次直接調用即可。
  • MongoDB支持各種編程語言:RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。
  • MongoDB安裝簡單

Linux平台安裝MongoDB

MongoDB 提供了 linux 各個發行版本 64 位的安裝包,你可以在官網下載安裝包。

MongoDB 源碼下載地址:https://www.mongodb.com/download-center#community

安裝前我們需要安裝各個 Linux 平台依賴包。

Red Hat/CentOS:

sudo yum install libcurl openssl

Ubuntu 18.04 LTS ("Bionic")/Debian 10 "Buster":

sudo apt-get install libcurl4 openssl

Ubuntu 16.04 LTS ("Xenial")/Debian 9 "Stretch":

sudo apt-get install libcurl3 openssl

查看ubuntu的版本

lsb_release -a

image-20211026193919108

image-20211026201305053

image-20211026201645786

這裏我們選擇 tgz 下載,下載完安裝包,並解壓 tgz(以下演示的是 64 位 Linux上的安裝) 。

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1604-4.4.10.tgz #下載 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1604-4.4.10.tgz #解壓

MongoDB 的可執行文件位於 bin 目錄下,所以可以將其添加到 PATH 路徑中

export PATH=<mongodb-install-directory>/bin:$PATH

為你 MongoDB 的安裝路徑。

創建數據庫目錄

默認情況下 MongoDB 啟動後會初始化以下兩個目錄:

  • 數據存儲目錄:/var/lib/mongodb
  • 日誌文件目錄:/var/log/mongodb

我們在啟動前可以先創建這兩個目錄:

sudo mkdir -p /var/lib/mongo sudo mkdir -p /var/log/mongodb

接下來啟動 Mongodb 服務:

mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork


MongoDB 後台管理 Shell

如果你需要進入 mongodb 後台管理,由於已經將MongoDB可執行文件添加到PATH路徑,所以可以直接執行 mongo 命令文件。

MongoDB Shell 是 MongoDB 自帶的交互式 Javascript shell,用來對 MongoDB 進行操作和管理的交互式環境。

當你進入 mongoDB 後台後,它默認會鏈接到 test 文檔(數據庫):

image-20211027223343278

MongoDB 概念解析

在mongodb中基本的概念是文檔、集合、數據庫。下表將幫助您更容易理解Mongo中的一些概念:

| SQL術語/概念 | MongoDB術語/概念 | 解釋/説明 | | :----------- | :--------------- | :---------------------------------- | | database | database | 數據庫 | | table | collection | 數據庫表/集合 | | row | document | 數據記錄行/文檔 | | column | field | 數據字段/域 | | index | index | 索引 | | table joins | | 表連接,MongoDB不支持 | | primary key | primary key | 主鍵,MongoDB自動將_id字段設置為主鍵 |

MongoDB 創建數據庫

數據庫

一個mongodb中可以建立多個數據庫。

MongoDB的默認數據庫為"db",該數據庫存儲在data目錄中。

MongoDB的單個實例可以容納多個獨立的數據庫,每一個都有自己的集合和權限,不同的數據庫也放置在不同的文件中。

"show dbs" 命令可以顯示所有數據的列表。

``` toby@recsys:~$ mongo MongoDB shell version: 2.6.10 connecting to: test

show dbs admin (empty) local 0.078GB ```

執行 "db" 命令可以顯示當前數據庫對象或集合。

``` toby@recsys:~$ mongo MongoDB shell version: 2.6.10 connecting to: test

db test ```

運行"use"命令,可以連接到一個指定的數據庫。

``` toby@recsys:~$ mongo MongoDB shell version: 2.6.10 connecting to: test

use admin switched to db admin db admin

```

語法

MongoDB 創建數據庫的語法格式如下:

use DATABASE_NAME

如果數據庫不存在,則創建數據庫,否則切換到指定數據庫。

實例

以下實例我們創建了數據庫 tobytest:

``` toby@recsys:~$ mongo MongoDB shell version: 2.6.10 connecting to: test

use tobytest switched to db tobytest db tobytest

```

如果你想查看所有數據庫,可以使用 show dbs 命令:

```

show dbs admin (empty) local 0.078GB

```

可以看到,我們剛創建的數據庫 tobytest並不在數據庫的列表中, 要顯示它,我們需要向 tobytest數據庫插入一些數據。

```

db.tobytest.insert({"name":"Toby"}) WriteResult({ "nInserted" : 1 }) show dbs admin (empty) local 0.078GB tobytest 0.078GB

```

MongoDB 中默認的數據庫為 test,如果你沒有創建新的數據庫,集合將存放在 test 數據庫中。

注意: 在 MongoDB 中,集合只有在內容插入後才會創建! 就是説,創建集合(數據表)後要再插入一個文檔(記錄),集合才會真正創建。

MongoDB 創建集合

MongoDB 中使用 createCollection() 方法來創建集合。

語法格式:

db.createCollection(name, options)

參數説明:

  • name: 要創建的集合名稱
  • options: 可選參數, 指定有關內存大小及索引的選項

options 可以是如下參數:

| 字段 | 類型 | 描述 | | :---------- | :--- | :----------------------------------------------------------- | | capped | 布爾 | (可選)如果為 true,則創建固定集合。固定集合是指有着固定大小的集合,當達到最大值時,它會自動覆蓋最早的文檔。 當該值為 true 時,必須指定 size 參數。 | | autoIndexId | 布爾 | 3.2 之後不再支持該參數。(可選)如為 true,自動在 _id 字段創建索引。默認為 false。 | | size | 數值 | (可選)為固定集合指定一個最大值,即字節數。 如果 capped 為 true,也需要指定該字段。 | | max | 數值 | (可選)指定固定集合中包含文檔的最大數量。 |

在插入文檔時,MongoDB 首先檢查固定集合的 size 字段,然後檢查 max 字段。

實例

在 tobytest 數據庫中創建 tobycollection 集合:

```

use tobytest switched to db tobytest db.createCollection("tobycollection") { "ok" : 1 }

```

如果要查看已有集合,可以使用 show collectionsshow tables 命令:

```

show tables system.indexes tobycollection tobytest

```

MongoDB 刪除集合

MongoDB 中使用 drop() 方法來刪除集合。

語法格式:

db.collection.drop()

參數説明:

返回值

如果成功刪除選定集合,則 drop() 方法返回 true,否則返回 false。

實例

在數據庫 tobytest中,我們可以先通過 show collections 命令查看已存在的集合:

```

use tobytest switched to db tobytest show collections system.indexes tobycollection tobytest

```

接着刪除集合 tobycollection:

```

db.tobycollection.drop() true

```

通過 show collections 再次查看數據庫 tobytest中的集合:

```

show collections system.indexes tobytest

```

從結果中可以看出 tobycollection集合已被刪除。

MongoDB 插入文檔

文檔的數據結構和 JSON 基本一樣。

所有存儲在集合中的數據都是 BSON 格式。

BSON 是一種類似 JSON 的二進制形式的存儲格式,是 Binary JSON 的簡稱。

插入文檔

MongoDB 使用 insert() 或 save() 方法向集合中插入文檔,語法如下:

db.COLLECTION_NAME.insert(document) 或 db.COLLECTION_NAME.save(document)

  • save():如果 _id 主鍵存在則更新數據,如果不存在就插入數據。該方法新版本中已廢棄,可以使用 db.collection.insertOne()db.collection.replaceOne() 來代替。
  • insert(): 若插入的數據主鍵已經存在,則會拋 org.springframework.dao.DuplicateKeyException 異常,提示主鍵重複,不保存當前數據。

實例

以下文檔可以存儲在 MongoDB 的 tobytest 數據庫 的 col 集合中:

```

db.col.insert({title:'Toby MongoDB', ... description:'this is MongoDB', ... tags:['mongodb','database','NoSQL'], ... likes:1 ... }) WriteResult({ "nInserted" : 1 })

```

以上實例中 col 是我們的集合名,如果該集合不在該數據庫中, MongoDB 會自動創建該集合並插入文檔。

查看已插入文檔:

```

db.col.find() { "_id" : ObjectId("617970fc286e9ff2b1250d70"), "title" : "Toby MongoDB", "description" : "this is MongoDB", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 1 }

```

我們也可以將數據定義為一個變量,如下所示:

```

document=({title:'Toby another MongoDB', ... description:'this is another MongoDB', ... tags:['mongodb','database','NoSQL'], ... likes:2 ... }) ```

執行後顯示結果如下:

{ "title" : "Toby another MongoDB", "description" : "this is another MongoDB", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 2 }

執行插入操作:

```

db.col.insert(document) WriteResult({ "nInserted" : 1 }) db.col.find() { "_id" : ObjectId("617970fc286e9ff2b1250d70"), "title" : "Toby MongoDB", "description" : "this is MongoDB", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 1 } { "_id" : ObjectId("61797229286e9ff2b1250d71"), "title" : "Toby another MongoDB", "description" : "this is another MongoDB", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 2 }

```

MongoDB 更新文檔

MongoDB 使用 update()save() 方法來更新集合中的文檔。接下來讓我們詳細來看下兩個函數的應用及其區別。


update() 方法

update() 方法用於更新已存在的文檔。語法格式如下:

db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } )

參數説明:

  • query : update的查詢條件,類似sql update查詢內where後面的。
  • update : update的對象和一些更新的操作符(如$,$inc...)等,也可以理解為sql update查詢內set後面的
  • upsert : 可選,這個參數的意思是,如果不存在update的記錄,是否插入objNew,true為插入,默認是false,不插入。
  • multi : 可選,mongodb 默認是false,只更新找到的第一條記錄,如果這個參數為true,就把按條件查出來多條記錄全部更新。
  • writeConcern :可選,拋出異常的級別。

實例

我們在集合 col 中插入如下數據:

```

db.col.insert({title:'Toby MongoDB', ... description:'this is MongoDB', ... tags:['mongodb','database','NoSQL'], ... likes:1 ... }) WriteResult({ "nInserted" : 1 })

```

接着我們通過 update() 方法來更新標題(title):

```

db.col.update({'title':'Toby MongoDB'},{$set:{'title':'MongoDB'}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) db.col.find().pretty() { "_id" : ObjectId("617970fc286e9ff2b1250d70"), "title" : "MongoDB", "description" : "this is MongoDB", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 1 } { "_id" : ObjectId("61797229286e9ff2b1250d71"), "title" : "Toby another MongoDB", "description" : "this is another MongoDB", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 2 }

```

可以看到標題(title)由原來的 "Toby MongoDB" 更新為了 "MongoDB"。

MongoDB 刪除文檔

MongoDB remove() 函數是用來移除集合中的數據。

MongoDB 數據更新可以使用 update() 函數。在執行 remove() 函數前先執行 find() 命令來判斷執行的條件是否正確,這是一個比較好的習慣。

語法

remove() 方法的基本語法格式如下所示:

db.collection.remove( <query>, <justOne> )

如果你的 MongoDB 是 2.6 版本以後的,語法格式如下:

db.collection.remove( <query>, { justOne: <boolean>, writeConcern: <document> } )

參數説明:

  • query :(可選)刪除的文檔的條件。
  • justOne : (可選)如果設為 true 或 1,則只刪除一個文檔,如果不設置該參數,或使用默認值 false,則刪除所有匹配條件的文檔。
  • writeConcern :(可選)拋出異常的級別。

實例

以下文檔我們執行兩次插入操作:

```

db.col.insert({title:'Toby MongoDB', description:'this is MongoDB', tags:['mongodb','database','NoSQL'], likes:1 }) WriteResult({ "nInserted" : 1 }) db.col.insert({title:'Toby MongoDB', description:'this is MongoDB', tags:['mongodb','database','NoSQL'], likes:1 }) WriteResult({ "nInserted" : 1 })

```

使用 find() 函數查詢數據:

```

db.col.find() { "_id" : ObjectId("617970fc286e9ff2b1250d70"), "title" : "MongoDB", "description" : "this is MongoDB", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 1 } { "_id" : ObjectId("61797229286e9ff2b1250d71"), "title" : "Toby another MongoDB", "description" : "this is another MongoDB", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 2 } { "_id" : ObjectId("6179747d286e9ff2b1250d72"), "title" : "Toby MongoDB", "description" : "this is MongoDB", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 1 } { "_id" : ObjectId("61797481286e9ff2b1250d73"), "title" : "Toby MongoDB", "description" : "this is MongoDB", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 1 }

```

接下來我們移除 title 為 'Toby MongoDB' 的文檔:

```

db.col.remove({'title':'Toby MongoDB'}) WriteResult({ "nRemoved" : 2 }) # 刪除了兩個 db.col.find() { "_id" : ObjectId("617970fc286e9ff2b1250d70"), "title" : "MongoDB", "description" : "this is MongoDB", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 1 } { "_id" : ObjectId("61797229286e9ff2b1250d71"), "title" : "Toby another MongoDB", "description" : "this is another MongoDB", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 2 }

```

如果你只想刪除第一條找到的記錄可以設置 justOne 為 1,如下所示:

```

db.COLLECTION_NAME.remove(DELETION_CRITERIA,1) ```

如果你想刪除所有數據,可以使用以下方式(類似常規 SQL 的 truncate 命令):

```

db.col.remove({}) WriteResult({ "nRemoved" : 2 }) db.col.find()

```

MongoDB 查詢文檔

MongoDB 查詢文檔使用 find() 方法。

find() 方法以非結構化的方式來顯示所有文檔。

語法

MongoDB 查詢數據的語法格式如下:

db.collection.find(query, projection)

  • query :可選,使用查詢操作符指定查詢條件
  • projection :可選,使用投影操作符指定返回的鍵。查詢時返回文檔中所有鍵值, 只需省略該參數即可(默認省略)。

如果你需要以易讀的方式來讀取數據,可以使用 pretty() 方法,語法格式如下:

```

db.col.find().pretty() ```

pretty() 方法以格式化的方式來顯示所有文檔。

實例

以下實例我們查詢了集合 col 中的數據:

```

db.col.insert({title:'Toby MongoDB', description:'this is MongoDB',by:'Toby', tags:['mongodb','database','NoSQL'], likes:100 }) WriteResult({ "nInserted" : 1 }) db.col.find().pretty() { "_id" : ObjectId("6179772f286e9ff2b1250d75"), "title" : "Toby MongoDB", "description" : "this is MongoDB", "by" : "Toby", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }

```

除了 find() 方法之外,還有一個 findOne() 方法,它只返回一個文檔。

MongoDB AND 條件

MongoDB 的 find() 方法可以傳入多個鍵(key),每個鍵(key)以逗號隔開,即常規 SQL 的 AND 條件。

語法格式如下:

```

db.col.find({key1:value1, key2:value2}).pretty() ```

實例

以下實例通過 bytitle 鍵來查詢 TobyToby MongoDB 的數據

```

db.col.find({'by':'Toby','title':'Toby MongoDB'}).prettydb.col.find({'by':'Toby','title':'Toby MongoDB'}).pretty() { "_id" : ObjectId("6179772f286e9ff2b1250d75"), "title" : "Toby MongoDB", "description" : "this is MongoDB", "by" : "Toby", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }

```

以上實例中類似於 WHERE 語句:WHERE by='Toby' AND title='Toby MongoDB'


MongoDB OR 條件

MongoDB OR 條件語句使用了關鍵字 $or,語法格式如下:

```

db.col.find( { $or: [ {key1: value1}, {key2:value2} ] } ).pretty() ```

實例

以下實例中,我們演示了查詢鍵 by 值為 Toby或鍵 title 值為 Toby MongoDB 的文檔。

```

db.col.find({$or:[{"by":"Toby"},{"title":"Toby MongoDB"}]}).pretty() { "_id" : ObjectId("6179772f286e9ff2b1250d75"), "title" : "Toby MongoDB", "description" : "this is MongoDB", "by" : "Toby", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }

```


AND 和 OR 聯合使用

以下實例演示了 AND 和 OR 聯合使用,類似常規 SQL 語句為: 'where likes>50 AND (by = 'Toby' OR title = 'Toby MongoDB')'

```

db.col.find({"likes":{$gt:50},$or:[{"by":"Toby"},{"title":"Toby MongoDB"}]}).pretty() { "_id" : ObjectId("6179772f286e9ff2b1250d75"), "title" : "Toby MongoDB", "description" : "this is MongoDB", "by" : "Toby", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }

```

MongoDB 排序


MongoDB sort() 方法

在 MongoDB 中使用 sort() 方法對數據進行排序,sort() 方法可以通過參數指定排序的字段,並使用 1 和 -1 來指定排序的方式,其中 1 為升序排列,而 -1 是用於降序排列。

語法

sort()方法基本語法如下所示:

```

db.COLLECTION_NAME.find().sort({KEY:1}) ```

實例

col 集合中的數據如下:

```

db.col.find().pretty() { "_id" : ObjectId("61797a56286e9ff2b1250d78"), "title" : "Toby PHP", "description" : "this is PHP", "by" : "Toby", "tags" : [ "PHP", "Language" ], "likes" : 100 } { "_id" : ObjectId("61797a62286e9ff2b1250d79"), "title" : "Toby JAVA", "description" : "this is JAVA", "by" : "Toby", "tags" : [ "JAVA", "Language" ], "likes" : 50 } { "_id" : ObjectId("61797a83286e9ff2b1250d7a"), "title" : "Toby Python", "description" : "this is Python", "by" : "Toby", "tags" : [ "Python", "Language" ], "likes" : 20 }

```

以下實例演示了 col 集合中的數據按字段 likes 的降序排列:

```

db.col.find({},{'title':1,_id:0}).sort({"likes":-1}) { "title" : "Toby PHP" } { "title" : "Toby JAVA" } { "title" : "Toby Python" }

```

Python MongoDB


PyMongo

Python 要連接 MongoDB 需要 MongoDB 驅動,這裏我們使用 PyMongo 驅動來連接。

pip 安裝

pip 是一個通用的 Python 包管理工具,提供了對 Python 包的查找、下載、安裝、卸載的功能。

安裝 pymongo:

$ python3 -m pip install pymongo

測試 PyMongo

接下來我們可以創建一個測試文件 demo_test_mongodb.py,代碼如下:

import pymongo

執行以上代碼文件,如果沒有出現錯誤,表示安裝成功。

創建數據庫

創建一個數據庫

創建數據庫需要使用 MongoClient 對象,並且指定連接的 URL 地址和要創建的數據庫名。

如下實例中,我們創建的數據庫 pydb:

實例

python import pymongo myclient=pymongo.MongoClient("mongodb://localhost:27017/") mydb=myclient["pydb"]

注意: 在 MongoDB 中,數據庫只有在內容插入後才會創建! 就是説,數據庫創建後要創建集合(數據表)並插入一個文檔(記錄),數據庫才會真正創建。

判斷數據庫是否已存在

我們可以讀取 MongoDB 中的所有數據庫,並判斷指定的數據庫是否存在:

實例

```python import pymongo myclient=pymongo.MongoClient("mongodb://localhost:27017/") mydb=myclient["pydb"]

dblist = myclient.list_database_names()

dblist = myclient.database_names()

if "pydb" in dblist: print("數據庫已存在!") else: print('數據庫不存在') ```

注意:database_names 在最新版本的 Python 中已廢棄,Python3.7+ 之後的版本改為了 list_database_names()。

image-20211030141217841

創建集合

MongoDB 中的集合類似 SQL 的表。

創建一個集合

MongoDB 使用數據庫對象來創建集合,實例如下:

實例

```python import pymongo myclient=pymongo.MongoClient("mongodb://localhost:27017/") mydb=myclient["pydb"]

mycol=myclient["col_set"] ```

注意: 在 MongoDB 中,集合只有在內容插入後才會創建! 就是説,創建集合(數據表)後要再插入一個文檔(記錄),集合才會真正創建。

判斷集合是否已存在

我們可以讀取 MongoDB 數據庫中的所有集合,並判斷指定的集合是否存在:

實例

```python import pymongo myclient=pymongo.MongoClient("mongodb://localhost:27017/") mydb=myclient["pydb"]

mycol=myclient["col_set"]

collist = mydb. list_collection_names() if "col_set" in collist: # 判斷 sites 集合是否存在 print("集合已存在!") else: print('集合不存在') ```

image-20211030141526295

Python Mongodb 插入文檔

MongoDB 中的一個文檔類似 SQL 表中的一條記錄。

插入集合

集合中插入文檔使用 insert_one() 方法,該方法的第一參數是字典 name => value 對。

以下實例向 col_set 集合中插入文檔:

實例

```python import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["pydb"] mycol = mydb["col_set"]

mydict = { "name": "Toby", "age": "23", "url": "https://juejin.cn/user/3403743731649863" }

x = mycol.insert_one(mydict) print(x) ```

image-20211030142137931

在命令行看一下是否插入成功

```

use pydb switched to db pydb db.col_set.find() { "_id" : ObjectId("617ce42cbc6011eaf1529012"), "name" : "Toby", "url" : "https://juejin.cn/user/3403743731649863", "age" : "23" }

```

插入多個文檔

集合中插入多個文檔使用 insert_many() 方法,該方法的第一參數是字典列表。

實例

```python import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["pydb"] mycol = mydb["col_set"]

mylist = [ { "name": "Tom", "age": "100", "url": "https://juejin.cn/user/3403743731649863" }, { "name": "Mary", "age": "101", "url": "https://juejin.cn/user/3403743731649863" }, { "name": "Timi", "age": "10", "url": "https://juejin.cn/user/3403743731649863" }, ]

x = mycol.insert_many(mylist)

輸出插入的所有文檔對應的 _id 值

print(x.inserted_ids) ```

image-20211030142656115

在命令行看一下是否插入成功

```

use pydb switched to db pydb db.col_set.find() { "_id" : ObjectId("617ce42cbc6011eaf1529012"), "name" : "Toby", "url" : "https://juejin.cn/user/3403743731649863", "age" : "23" } { "_id" : ObjectId("617ce591826d13d898f97890"), "name" : "Tom", "url" : "https://juejin.cn/user/3403743731649863", "age" : "100" } { "_id" : ObjectId("617ce591826d13d898f97891"), "name" : "Mary", "url" : "https://juejin.cn/user/3403743731649863", "age" : "101" } { "_id" : ObjectId("617ce591826d13d898f97892"), "name" : "Timi", "url" : "https://juejin.cn/user/3403743731649863", "age" : "10" }

```

Python Mongodb 查詢文檔

MongoDB 中使用了 find 和 find_one 方法來查詢集合中的數據,它類似於 SQL 中的 SELECT 語句。

查詢一條數據

我們可以使用 find_one() 方法來查詢集合中的一條數據。

查詢 col_set 文檔中的第一條數據:

實例

```python import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["pydb"] mycol = mydb["col_set"]

x = mycol.find_one()

print(x) ```

image-20211030142943707

查詢集合中所有數據

find() 方法可以查詢集合中的所有數據,類似 SQL 中的 SELECT * 操作。

以下實例查找 col_set 集合中的所有數據:

實例

```python import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["pydb"] mycol = mydb["col_set"]

for x in mycol.find(): print(x) ```

image-20211030143207556

查詢指定字段的數據

我們可以使用 find() 方法來查詢指定字段的數據,將要返回的字段對應值設置為 1。

實例

```python import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["pydb"] mycol = mydb["col_set"]

for x in mycol.find({},{ "_id": 0, "name": 1, "age": 1 }): print(x) ```

image-20211030144042132

根據指定條件查詢

我們可以在 find() 中設置參數來過濾數據。

以下實例查找 name 字段為 "Toby" 的數據:

實例

```python import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["pydb"] mycol = mydb["col_set"]

myquery = { "name": "Toby" }

mydoc = mycol.find(myquery)

for x in mydoc: print(x) ```

image-20211030144414902

返回指定條數記錄

如果我們要對查詢結果設置指定條數的記錄可以使用 limit() 方法,該方法只接受一個數字參數。

以下實例返回 3 條文檔記錄:

實例

```python import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["pydb"] mycol = mydb["col_set"]

myresult = mycol.find().limit(3)

輸出結果

for x in myresult: print(x) ```

image-20211030144609160

Python Mongodb 修改文檔

我們可以在 MongoDB 中使用 update_one() 方法修改文檔中的記錄。該方法第一個參數為查詢的條件,第二個參數為要修改的字段。

如果查找到的匹配數據多於一條,則只會修改第一條。

以下實例將 age字段的值 23改為 12345:

實例

```python import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["pydb"] mycol = mydb["col_set"]

myquery = { "age": "23" } newvalues = { "$set": { "age": "12345" } }

mycol.update_one(myquery, newvalues)

輸出修改後的 "sites" 集合

for x in mycol.find(): print(x) ```

image-20211030144819907

排序

sort() 方法可以指定升序或降序排序。

sort() 方法第一個參數為要排序的字段,第二個字段指定排序規則,1 為升序,-1 為降序,默認為升序。

對字段 age 按升序排序:

實例

```python import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["pydb"] mycol = mydb["col_set"]

mydoc = mycol.find().sort("age") for x in mydoc: print(x) ```

image-20211030145059219

對字段 age按降序排序:

```python import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["pydb"] mycol = mydb["col_set"]

mydoc = mycol.find().sort("alexa", -1)

for x in mydoc: print(x) ```

image-20211030145239034

Python Mongodb 刪除數據

我們可以使用 delete_one() 方法來刪除一個文檔,該方法第一個參數為查詢對象,指定要刪除哪些數據。

以下實例刪除 name 字段值為 "Timi" 的文檔:

實例

```python import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["pydb"] mycol = mydb["col_set"]

myquery = { "name": "Timi" }

mycol.delete_one(myquery)

刪除後輸出

for x in mycol.find(): print(x) ```

image-20211030145408484

刪除集合中的所有文檔

delete_many() 方法如果傳入的是一個空的查詢對象,則會刪除集合中的所有文檔:

實例

```python import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["pydb"] mycol = mydb["col_set"]

x = mycol.delete_many({})

print(x.deleted_count, "個文檔已刪除") ```

image-20211030145528857

刪除集合

我們可以使用 drop() 方法來刪除一個集合。

以下實例刪除了 col_set集合:

實例

```python import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["pydb"] mycol = mydb["col_set"]

mycol.drop()

```

我們在終端查看一下

```

use pydb switched to db pydb show tables system.indexes

```

參考鏈接:

  • https://www.runoob.com/python3/python-mongodb.html

  • https://www.runoob.com/mongodb/mongodb-tutorial.html