主頁(yè) > 知識(shí)庫(kù) > MongoDB安裝使用并實(shí)現(xiàn)Python操作數(shù)據(jù)庫(kù)

MongoDB安裝使用并實(shí)現(xiàn)Python操作數(shù)據(jù)庫(kù)

熱門(mén)標(biāo)簽:呼和浩特外呼系統(tǒng)原理是什么 內(nèi)蒙古營(yíng)銷(xiāo)智能外呼系統(tǒng)哪個(gè)好 crm外呼系統(tǒng)聯(lián)系方式 長(zhǎng)沙電銷(xiāo)外呼防封卡是什么 小裙科技電銷(xiāo)機(jī)器人怎樣 外呼線路資源屬于電信業(yè)務(wù)嗎 智能外呼系統(tǒng)官網(wǎng) 青白江400企業(yè)電話申請(qǐng) 河南電話外呼系統(tǒng)招商

一、MongoDB介紹

MongoDB 是一個(gè)是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù),介于關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)之間,是非關(guān)系數(shù)據(jù)庫(kù)當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫(kù)的。他支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類(lèi)似json的bson格式,因此可以存儲(chǔ)比較復(fù)雜的數(shù)據(jù)類(lèi)型。Mongo最大的特點(diǎn)是他支持的查詢(xún)語(yǔ)言非常強(qiáng)大,其語(yǔ)法有點(diǎn)類(lèi)似于面向?qū)ο蟮牟樵?xún)語(yǔ)言,幾乎可以實(shí)現(xiàn)類(lèi)似關(guān)系數(shù)據(jù)庫(kù)單表查詢(xún)的絕大部分功能,而且還支持對(duì)數(shù)據(jù)建立索引。

二、安裝MongoDB

MongoDB安裝很簡(jiǎn)單,無(wú)需下載源文件,可以直接用apt-get命令進(jìn)行安裝。如果網(wǎng)速太差,并且已經(jīng)下載MongoDB的安裝包時(shí),可以離線方式安裝,參考Ubuntu下MongoDB安裝與使用教程(離線安裝方式)。推薦使用apt-get命令進(jìn)行在線安裝,可以避免很多莫名其妙的問(wèn)題。
以下命令

sudo apt-get install mongodb

可下載安裝MongoDB,默認(rèn)安裝的版本是MongoDB 2.6.10,但目前MongoDB已經(jīng)升級(jí)到3.2.8,這里將指導(dǎo)讀者通過(guò)添加軟件源的方式來(lái)安裝3.2.8版本。
首先打開(kāi)終端,導(dǎo)入公共key到包管理器,輸入以下命令:

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927   

創(chuàng)建MongoDB的文件列表

#僅適用于Ubuntu14.04,輸入:
echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list

更新包管理器,安裝MongoDB,輸入以下命令:
sudo apt-get update
sudo apt-get install -y mongodb-org

注意:如果執(zhí)行“sudo apt-get update”命令后出現(xiàn)如下錯(cuò)誤:

···
update completed, but some metadata was ignored due to errors.
E: 無(wú)法獲得鎖 /var/lib/dpkg/lock – open (11: 資源暫時(shí)不可用)
E: 無(wú)法鎖定管理目錄(/var/lib/dpkg/),是否有其他進(jìn)程正占用它?
···

請(qǐng)按照如下方法解決錯(cuò)誤,也就是輸入以下三條命令:

sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock
sudo apt-get update

運(yùn)行上面三條命令以后,應(yīng)該就可以順利完成apt-get update了。

安裝完成MongoDB以后,在終端輸入以下命令查看MongoDB版本:

mongo -version

輸出版本信息,表明安裝成功。

啟動(dòng)和關(guān)閉mongodb命令如下:

sudo service mongodb start
sudo service mongodb stop

默認(rèn)設(shè)置MongoDB是隨Ubuntu啟動(dòng)自動(dòng)啟動(dòng)的。
輸入以下命令查看是否啟動(dòng)成功:

pgrep mongo -l   #注意:-l是英文字母l,不是阿拉伯?dāng)?shù)字1

查看是否啟動(dòng)成功

出現(xiàn)安裝錯(cuò)誤的解決方案:
輸入“sudo service mongodb start”啟動(dòng)mongodb的時(shí)候,如果報(bào)這個(gè)錯(cuò)誤:Failed to start mongod.service: Unit not found
請(qǐng)按照如下步驟解決該錯(cuò)誤:
(1)使用vim編輯器創(chuàng)建配置文件

sudo vim /etc/systemd/system/mongodb.service

(2)在該配置文件中添加如下內(nèi)容:

[Unit]
Description=High-performance, schema-free document-oriented database
After=network.target

[Service]
User=mongodb
ExecStart=/usr/bin/mongod --quiet --config /etc/mongod.conf

[Install]
WantedBy=multi-user.target

保存退出vim編輯器。
(3)輸入如下命令啟動(dòng)mongodb:

sudo systemctl start mongodb 
sudo systemctl status mongodb 

這時(shí)就可以啟動(dòng)成功了。
以后,每次啟動(dòng)和關(guān)閉MongoDB,就可以仍然使用如下命令:

sudo service mongodb start
sudo service mongodb stop

三、使用MongoDB

shell命令模式
輸入如下命令進(jìn)入MongoDB的shell命令模式:

mongo
或者:sudo mongo

默認(rèn)連接的數(shù)據(jù)庫(kù)是test數(shù)據(jù)庫(kù),在此之前一定要確保你已經(jīng)啟動(dòng)了MongoDB,否則會(huì)出現(xiàn)錯(cuò)誤,啟動(dòng)之后運(yùn)行成功,如下
mongo shell常用操作命令:

數(shù)據(jù)庫(kù)相關(guān)
show dbs:顯示數(shù)據(jù)庫(kù)列表
show collections:顯示當(dāng)前數(shù)據(jù)庫(kù)中的集合(類(lèi)似關(guān)系數(shù)據(jù)庫(kù)中的表table)
show users:顯示所有用戶
use yourDB:切換當(dāng)前數(shù)據(jù)庫(kù)至yourDB
db.help() :顯示數(shù)據(jù)庫(kù)操作命令
db.yourCollection.help() :顯示集合操作命令,yourCollection是集合名

MongoDB沒(méi)有創(chuàng)建數(shù)據(jù)庫(kù)的命令,如果你想創(chuàng)建一個(gè)“School”的數(shù)據(jù)庫(kù),先運(yùn)行use School命令,之后做一些操作(如:創(chuàng)建聚集集合db.createCollection(‘teacher')),這樣就可以創(chuàng)建一個(gè)名叫“School”的數(shù)據(jù)庫(kù)。
自動(dòng)創(chuàng)建school數(shù)據(jù)庫(kù)
下面以一個(gè)School數(shù)據(jù)庫(kù)為例,在School數(shù)據(jù)庫(kù)中創(chuàng)建兩個(gè)集合teacher和student,并對(duì)student集合中的數(shù)據(jù)進(jìn)行增刪改查基本操作(集合Collection相當(dāng)于關(guān)系型數(shù)據(jù)庫(kù)中的表table)。

1、切換到School數(shù)據(jù)庫(kù)

use School #切換到School數(shù)據(jù)庫(kù)。MongoDB 無(wú)需預(yù)創(chuàng)建School數(shù)據(jù)庫(kù),在使用時(shí)會(huì)自動(dòng)創(chuàng)建

2、創(chuàng)建集合Collection

本章節(jié)我們?yōu)榇蠹医榻B如何使用 MongoDB 來(lái)創(chuàng)建集合。

MongoDB 中使用 createCollection() 方法來(lái)創(chuàng)建集合。

語(yǔ)法格式:

db.createCollection(name, options) 

參數(shù)說(shuō)明:

name: 要?jiǎng)?chuàng)建的集合名稱(chēng)
options: 可選參數(shù), 指定有關(guān)內(nèi)存大小及索引的選項(xiàng)
options 可以是如下參數(shù):
在插入文檔時(shí),MongoDB 首先檢查固定集合的 size 字段,然后檢查 max 字段。

實(shí)例

在 test 數(shù)據(jù)庫(kù)中創(chuàng)建 runoob 集合:

> use test
switched to db test
> db.createCollection("runoob")
{ "ok" : 1 }
>
如果要查看已有集合,可以使用 show collections 命令:

> show collections
runoob
system.indexes
下面是帶有幾個(gè)關(guān)鍵參數(shù)的 createCollection() 的用法:

創(chuàng)建固定集合 mycol,整個(gè)集合空間大小 6142800 KB, 文檔最大個(gè)數(shù)為 10000 個(gè)。

> db.createCollection("mycol", { capped : true, autoIndexId : true, size :  6142800, max : 10000 } )
{ "ok" : 1 }
>
在 MongoDB 中,你不需要?jiǎng)?chuàng)建集合。當(dāng)你插入一些文檔時(shí),MongoDB 會(huì)自動(dòng)創(chuàng)建集合。

> db.mycol2.insert({"name" : "菜鳥(niǎo)教程"})
> show collections
mycol2
...
##創(chuàng)建一個(gè)聚集集合。MongoDB 其實(shí)在插入數(shù)據(jù)的時(shí)候,也會(huì)自動(dòng)創(chuàng)建對(duì)應(yīng)的集合,無(wú)需預(yù)先創(chuàng)建

幾種重要的數(shù)據(jù)類(lèi)型。
ObjectId
ObjectId 類(lèi)似唯一主鍵,可以很快的去生成和排序,包含 12 bytes,含義是:

前 4 個(gè)字節(jié)表示創(chuàng)建 unix時(shí)間戳,格林尼治時(shí)間 UTC 時(shí)間,比北京時(shí)間晚了 8 個(gè)小時(shí)
接下來(lái)的 3 個(gè)字節(jié)是機(jī)器標(biāo)識(shí)碼
緊接的兩個(gè)字節(jié)由進(jìn)程 id 組成 PID
最后三個(gè)字節(jié)是隨機(jī)數(shù)
MongoDB 中存儲(chǔ)的文檔必須有一個(gè) _id 鍵。這個(gè)鍵的值可以是任何類(lèi)型的,默認(rèn)是個(gè) ObjectId 對(duì)象

由于 ObjectId 中保存了創(chuàng)建的時(shí)間戳,所以你不需要為你的文檔保存時(shí)間戳字段,你可以通過(guò) getTimestamp 函數(shù)來(lái)獲取文檔的創(chuàng)建時(shí)間:

> var newObject = ObjectId()
> newObject.getTimestamp()
ISODate("2017-11-25T07:21:10Z")
ObjectId 轉(zhuǎn)為字符串

> newObject.str
5a1919e63df83ce79df8b38f
字符串
BSON 字符串都是 UTF-8 編碼。

時(shí)間戳
BSON 有一個(gè)特殊的時(shí)間戳類(lèi)型用于 MongoDB 內(nèi)部使用,與普通的日期類(lèi)型不相關(guān)。 時(shí)間戳值是一個(gè) 64 位的值。其中:

前32位是一個(gè) time_t 值(與Unix新紀(jì)元相差的秒數(shù))
后32位是在某秒中操作的一個(gè)遞增的序數(shù)
在單個(gè) mongod 實(shí)例中,時(shí)間戳值通常是唯一的。

在復(fù)制集中, oplog 有一個(gè) ts 字段。這個(gè)字段中的值使用BSON時(shí)間戳表示了操作時(shí)間。

BSON 時(shí)間戳類(lèi)型主要用于 MongoDB 內(nèi)部使用。在大多數(shù)情況下的應(yīng)用開(kāi)發(fā)中,你可以使用 BSON 日期類(lèi)型。

日期
表示當(dāng)前距離 Unix新紀(jì)元(1970年1月1日)的毫秒數(shù)。日期類(lèi)型是有符號(hào)的, 負(fù)數(shù)表示 1970 年之前的日期。

> var mydate1 = new Date()     //格林尼治時(shí)間
> mydate1
ISODate("2018-03-04T14:58:51.233Z")
> typeof mydate1
object
> var mydate2 = ISODate() //格林尼治時(shí)間
> mydate2
ISODate("2018-03-04T15:00:45.479Z")
> typeof mydate2
object
這樣創(chuàng)建的時(shí)間是日期類(lèi)型,可以使用 JS 中的 Date 類(lèi)型的方法。

返回一個(gè)時(shí)間類(lèi)型的字符串:

> var mydate1str = mydate1.toString()
> mydate1str
Sun Mar 04 2018 14:58:51 GMT+0000 (UTC) 
> typeof mydate1str
string
或者

> Date()
Sun Mar 04 2018 15:02:59 GMT+0000 (UTC)   

1、插入數(shù)據(jù)

與數(shù)據(jù)庫(kù)創(chuàng)建類(lèi)似,插入數(shù)據(jù)時(shí)也會(huì)自動(dòng)創(chuàng)建集合。
插入數(shù)據(jù)有兩種方式:insert和save。

db.student.insert({_id:1, sname: 'zhangsan', sage: 20}) #_id可選
db.student.save({_id:1, sname: 'zhangsan', sage: 22}) #_id可選

這兩種方式,其插入的數(shù)據(jù)中_id字段均可不寫(xiě),會(huì)自動(dòng)生成一個(gè)唯一的_id來(lái)標(biāo)識(shí)本條數(shù)據(jù)。而insert和save不同之處在于:在手動(dòng)插入_id字段時(shí),如果_id已經(jīng)存在,insert不做操作,save做更新操作;如果不加_id字段,兩者作用相同點(diǎn)都是插入數(shù)據(jù)。
insert和save添加的數(shù)據(jù)其結(jié)構(gòu)是松散的,列屬性均不固定,根據(jù)添加的數(shù)據(jù)為準(zhǔn)。先定義數(shù)據(jù)再插入,就可以一次性插入多條數(shù)據(jù),
插入多條
運(yùn)行完以上例子,student 已自動(dòng)創(chuàng)建,這也說(shuō)明 MongoDB 不需要預(yù)先定義 collection ,在第一次插入數(shù)據(jù)后,collection 會(huì)自動(dòng)的創(chuàng)建。

2、查找數(shù)據(jù)

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

find() 方法以非結(jié)構(gòu)化的方式來(lái)顯示所有文檔。

語(yǔ)法
MongoDB 查詢(xún)數(shù)據(jù)的語(yǔ)法格式如下:

db.collection.find(query, projection)
query :可選,使用查詢(xún)操作符指定查詢(xún)條件
projection :可選,使用投影操作符指定返回的鍵。查詢(xún)時(shí)返回文檔中所有鍵值, 只需省略該參數(shù)即可(默認(rèn)省略)。
如果你需要以易讀的方式來(lái)讀取數(shù)據(jù),可以使用 pretty() 方法,語(yǔ)法格式如下:

>db.col.find().pretty()
pretty() 方法以格式化的方式來(lái)顯示所有文檔。

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

MongoDB 與 RDBMS Where 語(yǔ)句比較
如果你熟悉常規(guī)的 SQL 數(shù)據(jù),通過(guò)下表可以更好的理解 MongoDB 的條件語(yǔ)句查詢(xún):

 

MongoDB AND 條件
MongoDB 的 find() 方法可以傳入多個(gè)鍵(key),每個(gè)鍵(key)以逗號(hào)隔開(kāi),即常規(guī) SQL 的 AND 條件。
語(yǔ)法格式如下:

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

MongoDB OR 條件
MongoDB OR 條件語(yǔ)句使用了關(guān)鍵字 $or,語(yǔ)法格式如下:

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

AND 和 OR 聯(lián)合使用
以下實(shí)例演示了 AND 和 OR 聯(lián)合使用,類(lèi)似常規(guī) SQL 語(yǔ)句為: ‘where likes>50 AND (by = ‘菜鳥(niǎo)教程' OR title = ‘MongoDB 教程')'

db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鳥(niǎo)教程"},{"title": "MongoDB 教程"}]}).pretty()

3、更新數(shù)據(jù)

MongoDB 更新文檔
MongoDB 使用 update() 和 save() 方法來(lái)更新集合中的文檔。接下來(lái)讓我們?cè)敿?xì)來(lái)看下兩個(gè)函數(shù)的應(yīng)用及其區(qū)別。

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

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

參數(shù)說(shuō)明:

query : update的查詢(xún)條件,類(lèi)似sql update查詢(xún)內(nèi)where后面的。
update : update的對(duì)象和一些更新的操作符(如 set, s e t , inc…)等,也可以理解為sql update查詢(xún)內(nèi)set后面的
upsert : 可選,這個(gè)參數(shù)的意思是,如果不存在update的記錄,是否插入objNew,true為插入,默認(rèn)是false,不插入。
multi : 可選,mongodb 默認(rèn)是false,只更新找到的第一條記錄,如果這個(gè)參數(shù)為true,就把按條件查出來(lái)多條記錄全部更新。
writeConcern :可選,拋出異常的級(jí)別。
實(shí)例
我們?cè)诩?col 中插入如下數(shù)據(jù):

>db.col.insert({
    title: 'MongoDB 教程', 
    description: 'MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)',
    by: '菜鳥(niǎo)教程',
    url: 'http://www.runoob.com',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
})

接著我們通過(guò) update() 方法來(lái)更新標(biāo)題(title):

>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})     ##加$set 用處:僅修改目標(biāo)行,否則不會(huì)保留其他行。
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })   # 輸出信息
> db.col.find().pretty()
{
        "_id" : ObjectId("56064f89ade2f21f36b03136"),
        "title" : "MongoDB",
        "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)",
        "by" : "菜鳥(niǎo)教程",
        "url" : "http://www.runoob.com",
        "tags" : [
                "mongodb",
                "database",
                "NoSQL"
        ],
        "likes" : 100
}
>
#可以看到標(biāo)題(title)由原來(lái)的 "MongoDB 教程" 更新為了 "MongoDB"。

以上語(yǔ)句只會(huì)修改第一條發(fā)現(xiàn)的文檔,如果你要修改多條相同的文檔,則需要設(shè)置 multi 參數(shù)為 true。

>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})

save() 方法
save() 方法通過(guò)傳入的文檔來(lái)替換已有文檔。語(yǔ)法格式如下:

db.collection.save(
   document>,
   {
     writeConcern: document>
   }
)

參數(shù)說(shuō)明:
document : 文檔數(shù)據(jù)。
writeConcern :可選,拋出異常的級(jí)別。
實(shí)例
以下實(shí)例中我們替換了 _id 為 56064f89ade2f21f36b03136 的文檔數(shù)據(jù):

>db.col.save({
    "_id" : ObjectId("56064f89ade2f21f36b03136"),
    "title" : "MongoDB",
    "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)",
    "by" : "Runoob",
    "url" : "http://www.runoob.com",
    "tags" : [
            "mongodb",
            "NoSQL"
    ],
    "likes" : 110
})
替換成功后,我們可以通過(guò) find() 命令來(lái)查看替換后的數(shù)據(jù)

>db.col.find().pretty()
{
        "_id" : ObjectId("56064f89ade2f21f36b03136"),
        "title" : "MongoDB",
        "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)",
        "by" : "Runoob",
        "url" : "http://www.runoob.com",
        "tags" : [
                "mongodb",
                "NoSQL"
        ],
        "likes" : 110
}
> 

更多實(shí)例
只更新第一條記錄:

db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );

全部更新:

db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );

只添加第一條:

db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );

全部添加加進(jìn)去:

db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );

全部更新:

db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );

只更新第一條記錄:

db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );

4、刪除數(shù)據(jù)

在前面的幾個(gè)章節(jié)中我們已經(jīng)學(xué)習(xí)了MongoDB中如何為集合添加數(shù)據(jù)和更新數(shù)據(jù)。在本章節(jié)中我們將繼續(xù)學(xué)習(xí)MongoDB集合的刪除。

MongoDB remove()函數(shù)是用來(lái)移除集合中的數(shù)據(jù)。

MongoDB數(shù)據(jù)更新可以使用update()函數(shù)。在執(zhí)行remove()函數(shù)前先執(zhí)行find()命令來(lái)判斷執(zhí)行的條件是否正確,這是一個(gè)比較好的習(xí)慣。

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

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

如果你的 MongoDB 是 2.6 版本以后的,語(yǔ)法格式如下:

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

參數(shù)說(shuō)明:
query :(可選)刪除的文檔的條件。
justOne : (可選)如果設(shè)為 true 或 1,則只刪除一個(gè)文檔。
writeConcern :(可選)拋出異常的級(jí)別。
實(shí)例
以下文檔我們執(zhí)行兩次插入操作:

>db.col.insert({title: 'MongoDB 教程', 
    description: 'MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)',
    by: '菜鳥(niǎo)教程',
    url: 'http://www.runoob.com',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
})

使用 find() 函數(shù)查詢(xún)數(shù)據(jù):

> db.col.find()
{ "_id" : ObjectId("56066169ade2f21f36b03137"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)", "by" : "菜鳥(niǎo)教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
{ "_id" : ObjectId("5606616dade2f21f36b03138"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)", "by" : "菜鳥(niǎo)教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
接下來(lái)我們移除 title 為 'MongoDB 教程' 的文檔:

>db.col.remove({'title':'MongoDB 教程'})
WriteResult({ "nRemoved" : 2 })           # 刪除了兩條數(shù)據(jù)
>db.col.find()
……                                        # 沒(méi)有數(shù)據(jù)
如果你只想刪除第一條找到的記錄可以設(shè)置 justOne 為 1,如下所示:

>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)
如果你想刪除所有數(shù)據(jù),可以使用以下方式(類(lèi)似常規(guī) SQL 的 truncate 命令):

>db.col.remove({})
>db.col.find()
>

5、條件運(yùn)算符

條件操作符用于比較兩個(gè)表達(dá)式并從mongoDB集合中獲取數(shù)據(jù)。
MongoDB中條件操作符有:

(>) 大于 - $gt
() 小于 - $lt
(>=) 大于等于 - $gte
(= ) 小于等于 - $lte

我們使用的數(shù)據(jù)庫(kù)名稱(chēng)為”runoob” 我們的集合名稱(chēng)為”col”,以下為我們插入的數(shù)據(jù)。

為了方便測(cè)試,我們可以先使用以下命令清空集合 “col” 的數(shù)據(jù):

db.col.remove({})
插入以下數(shù)據(jù)

>db.col.insert({
    title: 'PHP 教程', 
    description: 'PHP 是一種創(chuàng)建動(dòng)態(tài)交互性站點(diǎn)的強(qiáng)有力的服務(wù)器端腳本語(yǔ)言。',
    by: '菜鳥(niǎo)教程',
    url: 'http://www.runoob.com',
    tags: ['php'],
    likes: 200
})
>db.col.insert({title: 'Java 教程', 
    description: 'Java 是由Sun Microsystems公司于1995年5月推出的高級(jí)程序設(shè)計(jì)語(yǔ)言。',
    by: '菜鳥(niǎo)教程',
    url: 'http://www.runoob.com',
    tags: ['java'],
    likes: 150
})
>db.col.insert({title: 'MongoDB 教程', 
    description: 'MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)',
    by: '菜鳥(niǎo)教程',
    url: 'http://www.runoob.com',
    tags: ['mongodb'],
    likes: 100
})

使用find()命令查看數(shù)據(jù):

db.col.find()

MongoDB (>) 大于操作符 - $gt
如果你想獲取 “col” 集合中 “l(fā)ikes” 大于 100 的數(shù)據(jù),你可以使用以下命令:

db.col.find({"likes" : {$gt : 100}})
類(lèi)似于SQL語(yǔ)句:
Select * from col where likes > 100;
輸出結(jié)果:

> db.col.find({"likes" : {$gt : 100}})
{ "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種創(chuàng)建動(dòng)態(tài)交互性站點(diǎn)的強(qiáng)有力的服務(wù)器端腳本語(yǔ)言。", "by" : "菜鳥(niǎo)教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
{ "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級(jí)程序設(shè)計(jì)語(yǔ)言。", "by" : "菜鳥(niǎo)教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
> 
MongoDB(>=)大于等于操作符 - $gte
如果你想獲取"col"集合中 "likes" 大于等于 100 的數(shù)據(jù),你可以使用以下命令:

db.col.find({likes : {$gte : 100}})
類(lèi)似于SQL語(yǔ)句:

Select * from col where likes >=100;
輸出結(jié)果:

> db.col.find({likes : {$gte : 100}})
{ "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種創(chuàng)建動(dòng)態(tài)交互性站點(diǎn)的強(qiáng)有力的服務(wù)器端腳本語(yǔ)言。", "by" : "菜鳥(niǎo)教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
{ "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級(jí)程序設(shè)計(jì)語(yǔ)言。", "by" : "菜鳥(niǎo)教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
{ "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)", "by" : "菜鳥(niǎo)教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
> 
MongoDB () 小于操作符 - $lt
如果你想獲取"col"集合中 "likes" 小于 150 的數(shù)據(jù),你可以使用以下命令:

db.col.find({likes : {$lt : 150}})
類(lèi)似于SQL語(yǔ)句:

Select * from col where likes  150;
輸出結(jié)果:

> db.col.find({likes : {$lt : 150}})
{ "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)", "by" : "菜鳥(niǎo)教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
MongoDB (=) 小于操作符 - $lte
如果你想獲取"col"集合中 "likes" 小于等于 150 的數(shù)據(jù),你可以使用以下命令:

db.col.find({likes : {$lte : 150}})
類(lèi)似于SQL語(yǔ)句:

Select * from col where likes = 150;
輸出結(jié)果:

> db.col.find({likes : {$lte : 150}})
{ "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級(jí)程序設(shè)計(jì)語(yǔ)言。", "by" : "菜鳥(niǎo)教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
{ "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)", "by" : "菜鳥(niǎo)教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
MongoDB 使用 () 和 (>) 查詢(xún) - $lt 和 $gt
如果你想獲取"col"集合中 "likes" 大于100,小于 200 的數(shù)據(jù),你可以使用以下命令:

db.col.find({likes : {$lt :200, $gt : 100}})
類(lèi)似于SQL語(yǔ)句:

Select * from col where likes>100 AND  likes200;
輸出結(jié)果:

> db.col.find({likes : {$lt :200, $gt : 100}})
{ "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級(jí)程序設(shè)計(jì)語(yǔ)言。", "by" : "菜鳥(niǎo)教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
> 

6、MongoDB Limit與Skip方法

MongoDB Limit() 方法
如果你需要在MongoDB中讀取指定數(shù)量的數(shù)據(jù)記錄,可以使用MongoDB的Limit方法,limit()方法接受一個(gè)數(shù)字參數(shù),該參數(shù)指定從MongoDB中讀取的記錄條數(shù)。

語(yǔ)法
limit()方法基本語(yǔ)法如下所示:

db.COLLECTION_NAME.find().limit(NUMBER)

實(shí)例
集合 col 中的數(shù)據(jù)如下:

 db.col.find({},{"title":1,_id:0}).limit(2)      #  _id:0(投影1:表示顯示0:表示隱藏)
{ "title" : "PHP 教程" }
{ "title" : "Java 教程" }

注:如果你們沒(méi)有指定limit()方法中的參數(shù)則顯示集合中的所有數(shù)據(jù)。

MongoDB Skip() 方法
我們除了可以使用limit()方法來(lái)讀取指定數(shù)量的數(shù)據(jù)外,還可以使用skip()方法來(lái)跳過(guò)指定數(shù)量的數(shù)據(jù),skip方法同樣接受一個(gè)數(shù)字參數(shù)作為跳過(guò)的記錄條數(shù)。

 db.col.find({},{"title":1,_id:0}).limit(2)      #  _id:0(投影1:表示顯示0:表示隱藏)
{ "title" : "PHP 教程" }
{ "title" : "Java 教程" }

注:如果你們沒(méi)有指定limit()方法中的參數(shù)則顯示集合中的所有數(shù)據(jù)。

7.MongoDB排序

MongoDB sort()方法
在MongoDB中使用使用sort()方法對(duì)數(shù)據(jù)進(jìn)行排序,sort()方法可以通過(guò)參數(shù)指定排序的字段,并使用 1 和 -1 來(lái)指定排序的方式,其中 1 為升序排列,而-1是用于降序排列。

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

>db.COLLECTION_NAME.find().sort({KEY:1})
實(shí)例
col 集合中的數(shù)據(jù)如下:

{ "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種創(chuàng)建動(dòng)態(tài)交互性站點(diǎn)的強(qiáng)有力的服務(wù)器端腳本語(yǔ)言。", "by" : "菜鳥(niǎo)教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
{ "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級(jí)程序設(shè)計(jì)語(yǔ)言。", "by" : "菜鳥(niǎo)教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
{ "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)", "by" : "菜鳥(niǎo)教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
以下實(shí)例演示了 col 集合中的數(shù)據(jù)按字段 likes 的降序排列:

>db.col.find({},{"title":1,_id:0}).sort({"likes":-1})
{ "title" : "PHP 教程" }
{ "title" : "Java 教程" }
{ "title" : "MongoDB 教程" }
>

8.MongoDB索引

索引通常能夠極大的提高查詢(xún)的效率,如果沒(méi)有索引,MongoDB在讀取數(shù)據(jù)時(shí)必須掃描集合中的每個(gè)文件并選取那些符合查詢(xún)條件的記錄。

這種掃描全集合的查詢(xún)效率是非常低的,特別在處理大量的數(shù)據(jù)時(shí),查詢(xún)可以要花費(fèi)幾十秒甚至幾分鐘,這對(duì)網(wǎng)站的性能是非常致命的。

索引是特殊的數(shù)據(jù)結(jié)構(gòu),索引存儲(chǔ)在一個(gè)易于遍歷讀取的數(shù)據(jù)集合中,索引是對(duì)數(shù)據(jù)庫(kù)表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu)

ensureIndex() 方法
MongoDB使用 ensureIndex() 方法來(lái)創(chuàng)建索引。

語(yǔ)法
ensureIndex()方法基本語(yǔ)法格式如下所示:

db.COLLECTION_NAME.ensureIndex({KEY:1})
語(yǔ)法中 Key 值為你要?jiǎng)?chuàng)建的索引字段,1為指定按升序創(chuàng)建索引,如果你想按降序來(lái)創(chuàng)建索引指定為-1即可。

實(shí)例

db.col.ensureIndex({"title":1})

ensureIndex() 方法中你也可以設(shè)置使用多個(gè)字段創(chuàng)建索引(關(guān)系型數(shù)據(jù)庫(kù)中稱(chēng)作復(fù)合索引)。

db.col.ensureIndex({"title":1,"description":-1})

ensureIndex() 接收可選參數(shù),可選參數(shù)列表如下:

 

實(shí)例在后臺(tái)創(chuàng)建索引:

db.values.ensureIndex({open: 1, close: 1}, {background: true})

通過(guò)在創(chuàng)建索引時(shí)加background:true 的選項(xiàng),讓創(chuàng)建工作在后臺(tái)執(zhí)行

8.MongoDB 聚合

MongoDB中聚合(aggregate)主要用于處理數(shù)據(jù)(諸如統(tǒng)計(jì)平均值,求和等),并返回計(jì)算后的數(shù)據(jù)結(jié)果。有點(diǎn)類(lèi)似sql語(yǔ)句中的 count(*)。

aggregate() 方法
MongoDB中聚合的方法使用aggregate()。

語(yǔ)法
aggregate() 方法的基本語(yǔ)法格式如下所示:

db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

實(shí)例

集合中的數(shù)據(jù)如下:

{
   _id: ObjectId(7df78ad8902c)
   title: 'MongoDB Overview', 
   description: 'MongoDB is no sql database',
   by_user: 'runoob.com',
   url: 'http://www.runoob.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100
},
{
   _id: ObjectId(7df78ad8902d)
   title: 'NoSQL Overview', 
   description: 'No sql database is very fast',
   by_user: 'runoob.com',
   url: 'http://www.runoob.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 10
},
{
   _id: ObjectId(7df78ad8902e)
   title: 'Neo4j Overview', 
   description: 'Neo4j is no sql database',
   by_user: 'Neo4j',
   url: 'http://www.neo4j.com',
   tags: ['neo4j', 'database', 'NoSQL'],
   likes: 750
},
現(xiàn)在我們通過(guò)以上集合計(jì)算每個(gè)作者所寫(xiě)的文章數(shù),使用aggregate()計(jì)算結(jié)果如下:
## _id 指定根據(jù)那個(gè)屬性分組
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{
   "result" : [
      {
         "_id" : "runoob.com",
         "num_tutorial" : 2
      },
      {
         "_id" : "Neo4j",
         "num_tutorial" : 1
      }
   ],
   "ok" : 1
}

以上實(shí)例類(lèi)似sql語(yǔ)句: select by_user, count(*) from mycol group by by_user

在上面的例子中,我們通過(guò)字段by_user字段對(duì)數(shù)據(jù)進(jìn)行分組,并計(jì)算by_user字段相同值的總和。

下表展示了一些聚合的表達(dá)式:

 

管道的概念
管道在Unix和Linux中一般用于將當(dāng)前命令的輸出結(jié)果作為下一個(gè)命令的參數(shù)。

MongoDB的聚合管道將MongoDB文檔在一個(gè)管道處理完畢后將結(jié)果傳遞給下一個(gè)管道處理。管道操作是可以重復(fù)的。

表達(dá)式:處理輸入文檔并輸出。表達(dá)式是無(wú)狀態(tài)的,只能用于計(jì)算當(dāng)前聚合管道的文檔,不能處理其它的文檔。

這里我們介紹一下聚合框架中常用的幾個(gè)操作:

project:修改輸入文檔的結(jié)構(gòu)??梢杂脕?lái)重命名、增加或刪除域,也可以用于創(chuàng)建計(jì)算結(jié)果以及嵌套文檔。 p r o j e c t : 修 改 輸 入 文 檔 的 結(jié) 構(gòu) 。 可 以 用 來(lái) 重 命 名 、 增 加 或 刪 除 域 , 也 可 以 用 于 創(chuàng) 建 計(jì) 算 結(jié) 果 以 及 嵌 套 文 檔 。 match:用于過(guò)濾數(shù)據(jù),只輸出符合條件的文檔。 match使用MongoDB的標(biāo)準(zhǔn)查詢(xún)操作。 m a t c h 使 用 M o n g o D B 的 標(biāo) 準(zhǔn) 查 詢(xún) 操 作 。 limit:用來(lái)限制MongoDB聚合管道返回的文檔數(shù)。
skip:在聚合管道中跳過(guò)指定數(shù)量的文檔,并返回余下的文檔。 s k i p : 在 聚 合 管 道 中 跳 過(guò) 指 定 數(shù) 量 的 文 檔 , 并 返 回 余 下 的 文 檔 。 unwind:將文檔中的某一個(gè)數(shù)組類(lèi)型字段拆分成多條,每條包含數(shù)組中的一個(gè)值。
group:將集合中的文檔分組,可用于統(tǒng)計(jì)結(jié)果。 g r o u p : 將 集 合 中 的 文 檔 分 組 , 可 用 于 統(tǒng) 計(jì) 結(jié) 果 。 sort:將輸入文檔排序后輸出。
$geoNear:輸出接近某一地理位置的有序文檔。
管道操作符實(shí)例

1、$project實(shí)例

db.article.aggregate(
    { $project : {
        title : 1 ,
        author : 1 ,
    }}
 );
這樣的話結(jié)果中就只還有_id,tilte和author三個(gè)字段了,默認(rèn)情況下_id字段是被包含的,如果要想不包含_id話可以這樣:

db.article.aggregate(
    { $project : {
        _id : 0 ,
        title : 1 ,
        author : 1
    }});
2.$match實(shí)例

db.articles.aggregate( [
                        { $match : { score : { $gt : 70, $lte : 90 } } },
                        { $group: { _id: null, count: { $sum: 1 } } }
                       ] );
$match用于獲取分?jǐn)?shù)大于70小于或等于90記錄,然后將符合條件的記錄送到下一階段$group管道操作符進(jìn)行處理。

3.$skip實(shí)例

db.article.aggregate(
    { $skip : 5 });
經(jīng)過(guò)$skip管道操作符處理后,前五個(gè)文檔被"過(guò)濾"掉。

四 Python操作MongoDB

安裝PyMongo模塊

pip install pymongo

使用MongoClient建立連接

from pymongo import MongoClient
#鏈接格式
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
mongodb:// 這是固定的格式,必須要指定。

username:password@ 可選項(xiàng),如果設(shè)置,在連接數(shù)據(jù)庫(kù)服務(wù)器之后,驅(qū)動(dòng)都會(huì)嘗試登陸這個(gè)數(shù)據(jù)庫(kù)

host1 必須的指定至少一個(gè)host, host1 是這個(gè)URI唯一要填寫(xiě)的。它指定了要連接服務(wù)器的地址。如果要連接復(fù)制集,請(qǐng)指定多個(gè)主機(jī)地址。

portX 可選的指定端口,如果不填,默認(rèn)為27017

/database 如果指定username:password@,連接并驗(yàn)證登陸指定數(shù)據(jù)庫(kù)。若不指定,默認(rèn)打開(kāi) test 數(shù)據(jù)庫(kù)。

?options 是連接選項(xiàng)。如果不使用/database,則前面需要加上/。所有連接選項(xiàng)都是鍵值對(duì)name=value,鍵值對(duì)之間通過(guò)或;(分號(hào))隔開(kāi)
# 以下為三種建立無(wú)驗(yàn)證連接的方式
#client = MongoClient()
#client = MongoClient('localhost', 27017)
#client = MongoClient('mongodb://localhost:27017/')
#建立驗(yàn)證連接
使用用戶 admin 使用密碼 123456 連接到本地的 MongoDB 服務(wù)上。輸出結(jié)果如下所示:

> mongodb://admin:123456@localhost/
... 
使用用戶名和密碼連接登陸到指定數(shù)據(jù)庫(kù),格式如下:

mongodb://admin:123456@localhost/test

獲取數(shù)據(jù)庫(kù)

# 以下是兩種獲取數(shù)據(jù)庫(kù)的方式
db = client.pythondb
db = client['python-db']

獲取集合

# 以下是兩種獲取集合的方式
collection = db.python_collection
collection = db['python-collection']

上述任何命令都沒(méi)有在MongoDB服務(wù)器上實(shí)際執(zhí)行任何操作。當(dāng)?shù)谝粋€(gè)文檔插入集合時(shí)才創(chuàng)建集合和數(shù)據(jù)庫(kù)。

插入文檔

#!/usr/bin/python3
#coding=utf-8

import datetime
from pymongo import MongoClient

client = MongoClient()
db = client.pythondb
posts = db.posts

post = {"author": "Maxsu",
         "text": "My first blog post!",
         "tags": ["mongodb", "python", "pymongo"],
         "date": datetime.datetime.utcnow()}

posts.insert(post)
# 批量插入,參數(shù)為list
posts.insert_many(new_posts)

查找文檔

#!/usr/bin/python3
#coding=utf-8

import datetime
import pprint
from pymongo import MongoClient

client = MongoClient()
db = client.pythondb
posts = db.posts

# 查找單個(gè)文檔
print(posts.find_one())

# 查找多個(gè)文檔
for post in posts.find():
    print(post)

# 計(jì)數(shù)統(tǒng)計(jì)
print(posts.count())
print(posts.find({"author": "Maxsu"}).count())

到此這篇關(guān)于MongoDB安裝使用并實(shí)現(xiàn)Python操作數(shù)據(jù)庫(kù) 的文章就介紹到這了,更多相關(guān)MongoDB安裝使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 使用python向MongoDB插入時(shí)間字段的操作
  • 如何用python 操作MongoDB數(shù)據(jù)庫(kù)
  • 用Python實(shí)現(xiàn)定時(shí)備份Mongodb數(shù)據(jù)并上傳到FTP服務(wù)器
  • python連接mongodb數(shù)據(jù)庫(kù)操作數(shù)據(jù)示例
  • python爬蟲(chóng)用mongodb的理由
  • python爬蟲(chóng)數(shù)據(jù)保存到mongoDB的實(shí)例方法
  • Python MongoDB 插入數(shù)據(jù)時(shí)已存在則不執(zhí)行,不存在則插入的解決方法
  • Python操作Mongodb數(shù)據(jù)庫(kù)的方法小結(jié)
  • Python 操作 MongoDB 講解詳細(xì)

標(biāo)簽:菏澤 呼倫貝爾 黃石 白山 安順 池州 舟山 楚雄

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MongoDB安裝使用并實(shí)現(xiàn)Python操作數(shù)據(jù)庫(kù)》,本文關(guān)鍵詞  MongoDB,安裝,使用,并,實(shí)現(xiàn),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MongoDB安裝使用并實(shí)現(xiàn)Python操作數(shù)據(jù)庫(kù)》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于MongoDB安裝使用并實(shí)現(xiàn)Python操作數(shù)據(jù)庫(kù)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章