新聞推薦實戰(一):MongoDB 基礎
前文 萬字入門推薦系統 提到了後續內容圍繞兩大系列:推薦算法理論 + 新聞推薦實戰。本文屬於新聞推薦實戰—數據層—構建物料池之 MongoDB。MongoDB 數據庫在該項目中會用來存儲畫像數據(用戶畫像、新聞畫像),使用 MongoDB 存儲畫像的一個主要原因就是方便擴展,因爲畫像內容可能會隨着產品的不斷髮展而不斷的更新。作爲算法工程師需要了解常用的 MongoDB 語法(比如增刪改查,排序等),因爲在實際的工作可能會從 MongoDB 中獲取用戶、新聞畫像來構造相關特徵。本着這個目的,本文對 MongoDB 常見的語法及 Python 操作 MongoDB 進行了總結,方便大家快速瞭解。
-
主要特點
-
創建數據庫目錄
-
MongoDB 後臺管理 Shell
-
MongoDB 創建數據庫
-
數據庫
-
語法
-
實例
-
MongoDB 創建集合
-
實例
-
MongoDB 刪除集合
-
實例
-
MongoDB 插入文檔
-
插入文檔
-
實例
-
MongoDB 更新文檔
-
update() 方法
-
實例
-
MongoDB 刪除文檔
-
語法
-
實例
-
MongoDB 查詢文檔
-
語法
-
實例
-
MongoDB AND 條件
-
MongoDB OR 條件
-
AND 和 OR 聯合使用
-
MongoDB 排序
-
MongoDB sort() 方法
-
PyMongo
-
pip 安裝
-
測試 PyMongo
-
創建數據庫
-
創建一個數據庫
-
判斷數據庫是否已存在
-
創建集合
-
創建一個集合
-
判斷集合是否已存在
-
Python Mongodb 插入文檔
-
插入集合
-
插入多個文檔
-
Python Mongodb 查詢文檔
-
查詢一條數據
-
查詢集合中所有數據
-
查詢指定字段的數據
-
根據指定條件查詢
-
返回指定條數記錄
-
Python Mongodb 修改文檔
-
排序
-
Python Mongodb 刪除數據
-
刪除集合中的所有文檔
-
刪除集合
MongoDB 簡介
MongoDB 是由 C++ 語言編寫的,是一個基於分佈式文件存儲的開源數據庫系統。在高負載的情況下,添加更多的節點,可以保證服務器性能。MongoDB 旨在爲 WEB 應用提供可擴展的高性能數據存儲解決方案。
MongoDB 將數據存儲爲一個文檔,數據結構由鍵值 (key=>value) 對組成。MongoDB 文檔類似於 JSON 對象。字段值可以包含其他文檔,數組及文檔數組。
主要特點
-
MongoDB 是一個面向文檔存儲的數據庫,操作起來比較簡單和容易。
-
你可以在 MongoDB 記錄中設置任何屬性的索引 (如:First) 來實現更快的排序。
-
你可以通過本地或者網絡創建數據鏡像,這使得 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
這裏我們選擇 tgz 下載,下載完安裝包,並解壓 tgz(以下演示的是 64 位 Linux 上的安裝) 。
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1604-4.4.10.tgz #下載
tar -zxvf 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 文檔(數據庫):
MongoDB 概念解析
在 mongodb 中基本的概念是文檔、集合、數據庫。下表將幫助您更容易理解 Mongo 中的一些概念:
MongoDB 創建數據庫
數據庫
一個 mongodb 中可以建立多個數據庫。
MongoDB 的默認數據庫爲 "db",該數據庫存儲在 data 目錄中。
toby@recsys:~$ mongo
MongoDB shell version: 2.6.10
connecting to: test
> show dbs
admin (empty)
local 0.078GB
toby@recsys:~$ mongo
MongoDB shell version: 2.6.10
connecting to: test
> db
test
toby@recsys:~$ mongo
MongoDB shell version: 2.6.10
connecting to: test
> use admin
switched to db admin
> db
admin
>
語法
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 可以是如下參數:
在插入文檔時,MongoDB 首先檢查固定集合的 size 字段,然後檢查 max 字段。
實例
在 tobytest 數據庫中創建 runoob 集合:
> use tobytest
switched to db tobytest
> db.createCollection("tobycollection")
{ "ok" : 1 }
>
如果要查看已有集合,可以使用 show collections 或 show 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()
實例
以下實例通過 by 和 title 鍵來查詢 Toby 中 Toby 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:
實例
import pymongo
myclient=pymongo.MongoClient("mongodb://localhost:27017/")
mydb=myclient["pydb"]
注意: 在 MongoDB 中,數據庫只有在內容插入後纔會創建! 就是說,數據庫創建後要創建集合 (數據表) 並插入一個文檔(記錄),數據庫纔會真正創建。
判斷數據庫是否已存在
我們可以讀取 MongoDB 中的所有數據庫,並判斷指定的數據庫是否存在:
實例
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()。
創建集合
MongoDB 中的集合類似 SQL 的表。
創建一個集合
MongoDB 使用數據庫對象來創建集合,實例如下:
實例
import pymongo
myclient=pymongo.MongoClient("mongodb://localhost:27017/")
mydb=myclient["pydb"]
mycol=myclient["col_set"]
注意: 在 MongoDB 中,集合只有在內容插入後纔會創建! 就是說,創建集合 (數據表) 後要再插入一個文檔(記錄),集合纔會真正創建。
判斷集合是否已存在
我們可以讀取 MongoDB 數據庫中的所有集合,並判斷指定的集合是否存在:
實例
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('集合不存在')
Python Mongodb 插入文檔
MongoDB 中的一個文檔類似 SQL 表中的一條記錄。
插入集合
集合中插入文檔使用 insert_one() 方法,該方法的第一參數是字典 name => value 對。
以下實例向 col_set 集合中插入文檔:
實例
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)
在命令行看一下是否插入成功
> 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() 方法,該方法的第一參數是字典列表。
實例
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)
在命令行看一下是否插入成功
> 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 文檔中的第一條數據:
實例
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["pydb"]
mycol = mydb["col_set"]
x = mycol.find_one()
print(x)
查詢集合中所有數據
find() 方法可以查詢集合中的所有數據,類似 SQL 中的 **SELECT *** 操作。
以下實例查找 col_set 集合中的所有數據:
實例
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["pydb"]
mycol = mydb["col_set"]
for x in mycol.find():
print(x)
查詢指定字段的數據
我們可以使用 find() 方法來查詢指定字段的數據,將要返回的字段對應值設置爲 1。
實例
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)
根據指定條件查詢
我們可以在 find() 中設置參數來過濾數據。
以下實例查找 name 字段爲 "Toby" 的數據:
實例
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)
返回指定條數記錄
如果我們要對查詢結果設置指定條數的記錄可以使用 limit() 方法,該方法只接受一個數字參數。
以下實例返回 3 條文檔記錄:
實例
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)
Python Mongodb 修改文檔
我們可以在 MongoDB 中使用 update_one() 方法修改文檔中的記錄。該方法第一個參數爲查詢的條件,第二個參數爲要修改的字段。
如果查找到的匹配數據多於一條,則只會修改第一條。
以下實例將 age 字段的值 23 改爲 12345:
實例
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)
排序
sort() 方法可以指定升序或降序排序。
sort() 方法第一個參數爲要排序的字段,第二個字段指定排序規則,1 爲升序,-1 爲降序,默認爲升序。
對字段 age 按升序排序:
實例
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)
對字段 age 按降序排序:
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)
Python Mongodb 刪除數據
我們可以使用 delete_one() 方法來刪除一個文檔,該方法第一個參數爲查詢對象,指定要刪除哪些數據。
以下實例刪除 name 字段值爲 "Timi" 的文檔:
實例
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)
刪除集合中的所有文檔
delete_many() 方法如果傳入的是一個空的查詢對象,則會刪除集合中的所有文檔:
實例
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["pydb"]
mycol = mydb["col_set"]
x = mycol.delete_many({})
print(x.deleted_count, "個文檔已刪除")
刪除集合
我們可以使用 drop() 方法來刪除一個集合。
以下實例刪除了 col_set 集合:
實例
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
>
總結
本文主要介紹了 MongoDB 數據庫的相關概念及基本操作,爲了更好的瞭解 MongoDB 在新聞推薦系統中的應用,需要了解數據庫的相關概念並熟練使用 python 操作 MongoDB。
參考資料
-
https://www.runoob.com/python3/python-mongodb.html
-
https://www.runoob.com/mongodb/mongodb-tutorial.html
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/x6IU6QLJOmeABru4zXGsEg