新聞推薦實戰(一):MongoDB 基礎

前文 萬字入門推薦系統 提到了後續內容圍繞兩大系列:推薦算法理論 + 新聞推薦實戰。本文屬於新聞推薦實戰—數據層—構建物料池之 MongoDB。MongoDB 數據庫在該項目中會用來存儲畫像數據(用戶畫像、新聞畫像),使用 MongoDB 存儲畫像的一個主要原因就是方便擴展,因爲畫像內容可能會隨着產品的不斷髮展而不斷的更新。作爲算法工程師需要了解常用的 MongoDB 語法(比如增刪改查,排序等),因爲在實際的工作可能會從 MongoDB 中獲取用戶、新聞畫像來構造相關特徵。本着這個目的,本文對 MongoDB 常見的語法及 Python 操作 MongoDB 進行了總結,方便大家快速瞭解。

MongoDB 簡介

MongoDB 是由 C++ 語言編寫的,是一個基於分佈式文件存儲的開源數據庫系統。在高負載的情況下,添加更多的節點,可以保證服務器性能。MongoDB 旨在爲 WEB 應用提供可擴展的高性能數據存儲解決方案。

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

主要特點

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 啓動後會初始化以下兩個目錄:

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

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 中的一些概念:

rv3MEx

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)

參數說明:

options 可以是如下參數:

yHDthB

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

實例

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

> 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)

實例

以下文檔可以存儲在 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>
   }
)

參數說明:

實例

我們在集合 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>
   }
)

參數說明:

實例

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

> 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)

如果你需要以易讀的方式來讀取數據,可以使用 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:

實例

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。

參考資料

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/x6IU6QLJOmeABru4zXGsEg