目錄
- 一、MongoDB介紹
- 二、安裝MongoDB
- 三、使用MongoDB
- 1、插入數(shù)據(jù)
- 2、查找數(shù)據(jù)
- 3、更新數(shù)據(jù)
- 4、刪除數(shù)據(jù)
- 5、條件運算符
- 6、MongoDB Limit與Skip方法
- 7.MongoDB排序
- 8.MongoDB索引
- 8.MongoDB 聚合
- 四 Python操作MongoDB
一、MongoDB介紹
MongoDB 是一個是一個基于分布式文件存儲的數(shù)據(jù)庫,介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間,是非關(guān)系數(shù)據(jù)庫當中功能最豐富,最像關(guān)系數(shù)據(jù)庫的。他支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似json的bson格式,因此可以存儲比較復(fù)雜的數(shù)據(jù)類型。Mongo最大的特點是他支持的查詢語言非常強大,其語法有點類似于面向?qū)ο蟮牟樵冋Z言,幾乎可以實現(xiàn)類似關(guān)系數(shù)據(jù)庫單表查詢的絕大部分功能,而且還支持對數(shù)據(jù)建立索引。
二、安裝MongoDB
MongoDB安裝很簡單,無需下載源文件,可以直接用apt-get命令進行安裝。如果網(wǎng)速太差,并且已經(jīng)下載MongoDB的安裝包時,可以離線方式安裝,參考Ubuntu下MongoDB安裝與使用教程(離線安裝方式)。推薦使用apt-get命令進行在線安裝,可以避免很多莫名其妙的問題。
以下命令
sudo apt-get install mongodb
可下載安裝MongoDB,默認安裝的版本是MongoDB 2.6.10,但目前MongoDB已經(jīng)升級到3.2.8,這里將指導(dǎo)讀者通過添加軟件源的方式來安裝3.2.8版本。
首先打開終端,導(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)如下錯誤:
···
update completed, but some metadata was ignored due to errors.
E: 無法獲得鎖 /var/lib/dpkg/lock – open (11: 資源暫時不可用)
E: 無法鎖定管理目錄(/var/lib/dpkg/),是否有其他進程正占用它?
···
請按照如下方法解決錯誤,也就是輸入以下三條命令:
sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock
sudo apt-get update
運行上面三條命令以后,應(yīng)該就可以順利完成apt-get update了。
安裝完成MongoDB以后,在終端輸入以下命令查看MongoDB版本:
輸出版本信息,表明安裝成功。
啟動和關(guān)閉mongodb命令如下:
sudo service mongodb start
sudo service mongodb stop
默認設(shè)置MongoDB是隨Ubuntu啟動自動啟動的。
輸入以下命令查看是否啟動成功:
pgrep mongo -l #注意:-l是英文字母l,不是阿拉伯數(shù)字1
查看是否啟動成功
出現(xiàn)安裝錯誤的解決方案:
輸入“sudo service mongodb start”啟動mongodb的時候,如果報這個錯誤:Failed to start mongod.service: Unit not found
請按照如下步驟解決該錯誤:
(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)輸入如下命令啟動mongodb:
sudo systemctl start mongodb
sudo systemctl status mongodb
這時就可以啟動成功了。
以后,每次啟動和關(guān)閉MongoDB,就可以仍然使用如下命令:
sudo service mongodb start
sudo service mongodb stop
三、使用MongoDB
shell命令模式
輸入如下命令進入MongoDB的shell命令模式:
默認連接的數(shù)據(jù)庫是test數(shù)據(jù)庫,在此之前一定要確保你已經(jīng)啟動了MongoDB,否則會出現(xiàn)錯誤,啟動之后運行成功,如下
mongo shell常用操作命令:
數(shù)據(jù)庫相關(guān)
show dbs:顯示數(shù)據(jù)庫列表
show collections:顯示當前數(shù)據(jù)庫中的集合(類似關(guān)系數(shù)據(jù)庫中的表table)
show users:顯示所有用戶
use yourDB:切換當前數(shù)據(jù)庫至yourDB
db.help() :顯示數(shù)據(jù)庫操作命令
db.yourCollection.help() :顯示集合操作命令,yourCollection是集合名
MongoDB沒有創(chuàng)建數(shù)據(jù)庫的命令,如果你想創(chuàng)建一個“School”的數(shù)據(jù)庫,先運行use School命令,之后做一些操作(如:創(chuàng)建聚集集合db.createCollection(‘teacher')),這樣就可以創(chuàng)建一個名叫“School”的數(shù)據(jù)庫。
自動創(chuàng)建school數(shù)據(jù)庫
下面以一個School數(shù)據(jù)庫為例,在School數(shù)據(jù)庫中創(chuàng)建兩個集合teacher和student,并對student集合中的數(shù)據(jù)進行增刪改查基本操作(集合Collection相當于關(guān)系型數(shù)據(jù)庫中的表table)。
1、切換到School數(shù)據(jù)庫
use School #切換到School數(shù)據(jù)庫。MongoDB 無需預(yù)創(chuàng)建School數(shù)據(jù)庫,在使用時會自動創(chuàng)建
2、創(chuàng)建集合Collection
本章節(jié)我們?yōu)榇蠹医榻B如何使用 MongoDB 來創(chuàng)建集合。
MongoDB 中使用 createCollection() 方法來創(chuàng)建集合。
語法格式:
db.createCollection(name, options)
參數(shù)說明:
name: 要創(chuàng)建的集合名稱
options: 可選參數(shù), 指定有關(guān)內(nèi)存大小及索引的選項
options 可以是如下參數(shù):
在插入文檔時,MongoDB 首先檢查固定集合的 size 字段,然后檢查 max 字段。
實例
在 test 數(shù)據(jù)庫中創(chuàng)建 runoob 集合:
> use test
switched to db test
> db.createCollection("runoob")
{ "ok" : 1 }
>
如果要查看已有集合,可以使用 show collections 命令:
> show collections
runoob
system.indexes
下面是帶有幾個關(guān)鍵參數(shù)的 createCollection() 的用法:
創(chuàng)建固定集合 mycol,整個集合空間大小 6142800 KB, 文檔最大個數(shù)為 10000 個。
> db.createCollection("mycol", { capped : true, autoIndexId : true, size : 6142800, max : 10000 } )
{ "ok" : 1 }
>
在 MongoDB 中,你不需要創(chuàng)建集合。當你插入一些文檔時,MongoDB 會自動創(chuàng)建集合。
> db.mycol2.insert({"name" : "菜鳥教程"})
> show collections
mycol2
...
##創(chuàng)建一個聚集集合。MongoDB 其實在插入數(shù)據(jù)的時候,也會自動創(chuàng)建對應(yīng)的集合,無需預(yù)先創(chuàng)建
幾種重要的數(shù)據(jù)類型。
ObjectId
ObjectId 類似唯一主鍵,可以很快的去生成和排序,包含 12 bytes,含義是:
前 4 個字節(jié)表示創(chuàng)建 unix時間戳,格林尼治時間 UTC 時間,比北京時間晚了 8 個小時
接下來的 3 個字節(jié)是機器標識碼
緊接的兩個字節(jié)由進程 id 組成 PID
最后三個字節(jié)是隨機數(shù)
MongoDB 中存儲的文檔必須有一個 _id 鍵。這個鍵的值可以是任何類型的,默認是個 ObjectId 對象
由于 ObjectId 中保存了創(chuàng)建的時間戳,所以你不需要為你的文檔保存時間戳字段,你可以通過 getTimestamp 函數(shù)來獲取文檔的創(chuàng)建時間:
> var newObject = ObjectId()
> newObject.getTimestamp()
ISODate("2017-11-25T07:21:10Z")
ObjectId 轉(zhuǎn)為字符串
> newObject.str
5a1919e63df83ce79df8b38f
字符串
BSON 字符串都是 UTF-8 編碼。
時間戳
BSON 有一個特殊的時間戳類型用于 MongoDB 內(nèi)部使用,與普通的日期類型不相關(guān)。 時間戳值是一個 64 位的值。其中:
前32位是一個 time_t 值(與Unix新紀元相差的秒數(shù))
后32位是在某秒中操作的一個遞增的序數(shù)
在單個 mongod 實例中,時間戳值通常是唯一的。
在復(fù)制集中, oplog 有一個 ts 字段。這個字段中的值使用BSON時間戳表示了操作時間。
BSON 時間戳類型主要用于 MongoDB 內(nèi)部使用。在大多數(shù)情況下的應(yīng)用開發(fā)中,你可以使用 BSON 日期類型。
日期
表示當前距離 Unix新紀元(1970年1月1日)的毫秒數(shù)。日期類型是有符號的, 負數(shù)表示 1970 年之前的日期。
> var mydate1 = new Date() //格林尼治時間
> mydate1
ISODate("2018-03-04T14:58:51.233Z")
> typeof mydate1
object
> var mydate2 = ISODate() //格林尼治時間
> mydate2
ISODate("2018-03-04T15:00:45.479Z")
> typeof mydate2
object
這樣創(chuàng)建的時間是日期類型,可以使用 JS 中的 Date 類型的方法。
返回一個時間類型的字符串:
> 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ù)庫創(chuàng)建類似,插入數(shù)據(jù)時也會自動創(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字段均可不寫,會自動生成一個唯一的_id來標識本條數(shù)據(jù)。而insert和save不同之處在于:在手動插入_id字段時,如果_id已經(jīng)存在,insert不做操作,save做更新操作;如果不加_id字段,兩者作用相同點都是插入數(shù)據(jù)。
insert和save添加的數(shù)據(jù)其結(jié)構(gòu)是松散的,列屬性均不固定,根據(jù)添加的數(shù)據(jù)為準。先定義數(shù)據(jù)再插入,就可以一次性插入多條數(shù)據(jù),
插入多條
運行完以上例子,student 已自動創(chuàng)建,這也說明 MongoDB 不需要預(yù)先定義 collection ,在第一次插入數(shù)據(jù)后,collection 會自動的創(chuàng)建。
2、查找數(shù)據(jù)
MongoDB 查詢文檔使用 find() 方法。
find() 方法以非結(jié)構(gòu)化的方式來顯示所有文檔。
語法
MongoDB 查詢數(shù)據(jù)的語法格式如下:
db.collection.find(query, projection)
query :可選,使用查詢操作符指定查詢條件
projection :可選,使用投影操作符指定返回的鍵。查詢時返回文檔中所有鍵值, 只需省略該參數(shù)即可(默認省略)。
如果你需要以易讀的方式來讀取數(shù)據(jù),可以使用 pretty() 方法,語法格式如下:
>db.col.find().pretty()
pretty() 方法以格式化的方式來顯示所有文檔。
除了 find() 方法之外,還有一個 findOne() 方法,它只返回一個文檔。
MongoDB 與 RDBMS Where 語句比較
如果你熟悉常規(guī)的 SQL 數(shù)據(jù),通過下表可以更好的理解 MongoDB 的條件語句查詢:
MongoDB AND 條件
MongoDB 的 find() 方法可以傳入多個鍵(key),每個鍵(key)以逗號隔開,即常規(guī) SQL 的 AND 條件。
語法格式如下:
db.col.find({key1:value1, key2:value2}).pretty()
MongoDB OR 條件
MongoDB OR 條件語句使用了關(guān)鍵字 $or,語法格式如下:
db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
AND 和 OR 聯(lián)合使用
以下實例演示了 AND 和 OR 聯(lián)合使用,類似常規(guī) SQL 語句為: ‘where likes>50 AND (by = ‘菜鳥教程' OR title = ‘MongoDB 教程')'
db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鳥教程"},{"title": "MongoDB 教程"}]}).pretty()
3、更新數(shù)據(jù)
MongoDB 更新文檔
MongoDB 使用 update() 和 save() 方法來更新集合中的文檔。接下來讓我們詳細來看下兩個函數(shù)的應(yīng)用及其區(qū)別。
update() 方法
update() 方法用于更新已存在的文檔。語法格式如下:
db.collection.update(
query>,
update>,
{
upsert: boolean>,
multi: boolean>,
writeConcern: document>
}
)
參數(shù)說明:
query : update的查詢條件,類似sql update查詢內(nèi)where后面的。
update : update的對象和一些更新的操作符(如 set, s e t , inc…)等,也可以理解為sql update查詢內(nèi)set后面的
upsert : 可選,這個參數(shù)的意思是,如果不存在update的記錄,是否插入objNew,true為插入,默認是false,不插入。
multi : 可選,mongodb 默認是false,只更新找到的第一條記錄,如果這個參數(shù)為true,就把按條件查出來多條記錄全部更新。
writeConcern :可選,拋出異常的級別。
實例
我們在集合 col 中插入如下數(shù)據(jù):
>db.col.insert({
title: 'MongoDB 教程',
description: 'MongoDB 是一個 Nosql 數(shù)據(jù)庫',
by: '菜鳥教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
接著我們通過 update() 方法來更新標題(title):
>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}}) ##加$set 用處:僅修改目標行,否則不會保留其他行。
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) # 輸出信息
> db.col.find().pretty()
{
"_id" : ObjectId("56064f89ade2f21f36b03136"),
"title" : "MongoDB",
"description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫",
"by" : "菜鳥教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
>
#可以看到標題(title)由原來的 "MongoDB 教程" 更新為了 "MongoDB"。
以上語句只會修改第一條發(fā)現(xiàn)的文檔,如果你要修改多條相同的文檔,則需要設(shè)置 multi 參數(shù)為 true。
>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})
save() 方法
save() 方法通過傳入的文檔來替換已有文檔。語法格式如下:
db.collection.save(
document>,
{
writeConcern: document>
}
)
參數(shù)說明:
document : 文檔數(shù)據(jù)。
writeConcern :可選,拋出異常的級別。
實例
以下實例中我們替換了 _id 為 56064f89ade2f21f36b03136 的文檔數(shù)據(jù):
>db.col.save({
"_id" : ObjectId("56064f89ade2f21f36b03136"),
"title" : "MongoDB",
"description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫",
"by" : "Runoob",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"NoSQL"
],
"likes" : 110
})
替換成功后,我們可以通過 find() 命令來查看替換后的數(shù)據(jù)
>db.col.find().pretty()
{
"_id" : ObjectId("56064f89ade2f21f36b03136"),
"title" : "MongoDB",
"description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫",
"by" : "Runoob",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"NoSQL"
],
"likes" : 110
}
>
更多實例
只更新第一條記錄:
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 );
全部添加加進去:
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ù)
在前面的幾個章節(jié)中我們已經(jīng)學(xué)習了MongoDB中如何為集合添加數(shù)據(jù)和更新數(shù)據(jù)。在本章節(jié)中我們將繼續(xù)學(xué)習MongoDB集合的刪除。
MongoDB remove()函數(shù)是用來移除集合中的數(shù)據(jù)。
MongoDB數(shù)據(jù)更新可以使用update()函數(shù)。在執(zhí)行remove()函數(shù)前先執(zhí)行find()命令來判斷執(zhí)行的條件是否正確,這是一個比較好的習慣。
語法
remove() 方法的基本語法格式如下所示:
db.collection.remove(
query>,
justOne>
)
如果你的 MongoDB 是 2.6 版本以后的,語法格式如下:
db.collection.remove(
query>,
{
justOne: boolean>,
writeConcern: document>
}
)
參數(shù)說明:
query :(可選)刪除的文檔的條件。
justOne : (可選)如果設(shè)為 true 或 1,則只刪除一個文檔。
writeConcern :(可選)拋出異常的級別。
實例
以下文檔我們執(zhí)行兩次插入操作:
>db.col.insert({title: 'MongoDB 教程',
description: 'MongoDB 是一個 Nosql 數(shù)據(jù)庫',
by: '菜鳥教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
使用 find() 函數(shù)查詢數(shù)據(jù):
> db.col.find()
{ "_id" : ObjectId("56066169ade2f21f36b03137"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
{ "_id" : ObjectId("5606616dade2f21f36b03138"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
接下來我們移除 title 為 'MongoDB 教程' 的文檔:
>db.col.remove({'title':'MongoDB 教程'})
WriteResult({ "nRemoved" : 2 }) # 刪除了兩條數(shù)據(jù)
>db.col.find()
…… # 沒有數(shù)據(jù)
如果你只想刪除第一條找到的記錄可以設(shè)置 justOne 為 1,如下所示:
>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)
如果你想刪除所有數(shù)據(jù),可以使用以下方式(類似常規(guī) SQL 的 truncate 命令):
>db.col.remove({})
>db.col.find()
>
5、條件運算符
條件操作符用于比較兩個表達式并從mongoDB集合中獲取數(shù)據(jù)。
MongoDB中條件操作符有:
(>) 大于 - $gt
() 小于 - $lt
(>=) 大于等于 - $gte
(= ) 小于等于 - $lte
我們使用的數(shù)據(jù)庫名稱為”runoob” 我們的集合名稱為”col”,以下為我們插入的數(shù)據(jù)。
為了方便測試,我們可以先使用以下命令清空集合 “col” 的數(shù)據(jù):
db.col.remove({})
插入以下數(shù)據(jù)
>db.col.insert({
title: 'PHP 教程',
description: 'PHP 是一種創(chuàng)建動態(tài)交互性站點的強有力的服務(wù)器端腳本語言。',
by: '菜鳥教程',
url: 'http://www.runoob.com',
tags: ['php'],
likes: 200
})
>db.col.insert({title: 'Java 教程',
description: 'Java 是由Sun Microsystems公司于1995年5月推出的高級程序設(shè)計語言。',
by: '菜鳥教程',
url: 'http://www.runoob.com',
tags: ['java'],
likes: 150
})
>db.col.insert({title: 'MongoDB 教程',
description: 'MongoDB 是一個 Nosql 數(shù)據(jù)庫',
by: '菜鳥教程',
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}})
類似于SQL語句:
Select * from col where likes > 100;
輸出結(jié)果:
> db.col.find({"likes" : {$gt : 100}})
{ "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種創(chuàng)建動態(tài)交互性站點的強有力的服務(wù)器端腳本語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
{ "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級程序設(shè)計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
>
MongoDB(>=)大于等于操作符 - $gte
如果你想獲取"col"集合中 "likes" 大于等于 100 的數(shù)據(jù),你可以使用以下命令:
db.col.find({likes : {$gte : 100}})
類似于SQL語句:
Select * from col where likes >=100;
輸出結(jié)果:
> db.col.find({likes : {$gte : 100}})
{ "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種創(chuàng)建動態(tài)交互性站點的強有力的服務(wù)器端腳本語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
{ "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級程序設(shè)計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
{ "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
>
MongoDB () 小于操作符 - $lt
如果你想獲取"col"集合中 "likes" 小于 150 的數(shù)據(jù),你可以使用以下命令:
db.col.find({likes : {$lt : 150}})
類似于SQL語句:
Select * from col where likes 150;
輸出結(jié)果:
> db.col.find({likes : {$lt : 150}})
{ "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
MongoDB (=) 小于操作符 - $lte
如果你想獲取"col"集合中 "likes" 小于等于 150 的數(shù)據(jù),你可以使用以下命令:
db.col.find({likes : {$lte : 150}})
類似于SQL語句:
Select * from col where likes = 150;
輸出結(jié)果:
> db.col.find({likes : {$lte : 150}})
{ "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級程序設(shè)計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
{ "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
MongoDB 使用 () 和 (>) 查詢 - $lt 和 $gt
如果你想獲取"col"集合中 "likes" 大于100,小于 200 的數(shù)據(jù),你可以使用以下命令:
db.col.find({likes : {$lt :200, $gt : 100}})
類似于SQL語句:
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月推出的高級程序設(shè)計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
>
6、MongoDB Limit與Skip方法
MongoDB Limit() 方法
如果你需要在MongoDB中讀取指定數(shù)量的數(shù)據(jù)記錄,可以使用MongoDB的Limit方法,limit()方法接受一個數(shù)字參數(shù),該參數(shù)指定從MongoDB中讀取的記錄條數(shù)。
語法
limit()方法基本語法如下所示:
db.COLLECTION_NAME.find().limit(NUMBER)
實例
集合 col 中的數(shù)據(jù)如下:
db.col.find({},{"title":1,_id:0}).limit(2) # _id:0(投影1:表示顯示0:表示隱藏)
{ "title" : "PHP 教程" }
{ "title" : "Java 教程" }
注:如果你們沒有指定limit()方法中的參數(shù)則顯示集合中的所有數(shù)據(jù)。
MongoDB Skip() 方法
我們除了可以使用limit()方法來讀取指定數(shù)量的數(shù)據(jù)外,還可以使用skip()方法來跳過指定數(shù)量的數(shù)據(jù),skip方法同樣接受一個數(shù)字參數(shù)作為跳過的記錄條數(shù)。
db.col.find({},{"title":1,_id:0}).limit(2) # _id:0(投影1:表示顯示0:表示隱藏)
{ "title" : "PHP 教程" }
{ "title" : "Java 教程" }
注:如果你們沒有指定limit()方法中的參數(shù)則顯示集合中的所有數(shù)據(jù)。
7.MongoDB排序
MongoDB sort()方法
在MongoDB中使用使用sort()方法對數(shù)據(jù)進行排序,sort()方法可以通過參數(shù)指定排序的字段,并使用 1 和 -1 來指定排序的方式,其中 1 為升序排列,而-1是用于降序排列。
語法
sort()方法基本語法如下所示:
>db.COLLECTION_NAME.find().sort({KEY:1})
實例
col 集合中的數(shù)據(jù)如下:
{ "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種創(chuàng)建動態(tài)交互性站點的強有力的服務(wù)器端腳本語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
{ "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級程序設(shè)計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
{ "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
以下實例演示了 col 集合中的數(shù)據(jù)按字段 likes 的降序排列:
>db.col.find({},{"title":1,_id:0}).sort({"likes":-1})
{ "title" : "PHP 教程" }
{ "title" : "Java 教程" }
{ "title" : "MongoDB 教程" }
>
8.MongoDB索引
索引通常能夠極大的提高查詢的效率,如果沒有索引,MongoDB在讀取數(shù)據(jù)時必須掃描集合中的每個文件并選取那些符合查詢條件的記錄。
這種掃描全集合的查詢效率是非常低的,特別在處理大量的數(shù)據(jù)時,查詢可以要花費幾十秒甚至幾分鐘,這對網(wǎng)站的性能是非常致命的。
索引是特殊的數(shù)據(jù)結(jié)構(gòu),索引存儲在一個易于遍歷讀取的數(shù)據(jù)集合中,索引是對數(shù)據(jù)庫表中一列或多列的值進行排序的一種結(jié)構(gòu)
ensureIndex() 方法
MongoDB使用 ensureIndex() 方法來創(chuàng)建索引。
語法
ensureIndex()方法基本語法格式如下所示:
db.COLLECTION_NAME.ensureIndex({KEY:1})
語法中 Key 值為你要創(chuàng)建的索引字段,1為指定按升序創(chuàng)建索引,如果你想按降序來創(chuàng)建索引指定為-1即可。
實例
db.col.ensureIndex({"title":1})
ensureIndex() 方法中你也可以設(shè)置使用多個字段創(chuàng)建索引(關(guān)系型數(shù)據(jù)庫中稱作復(fù)合索引)。
db.col.ensureIndex({"title":1,"description":-1})
ensureIndex() 接收可選參數(shù),可選參數(shù)列表如下:
實例在后臺創(chuàng)建索引:
db.values.ensureIndex({open: 1, close: 1}, {background: true})
通過在創(chuàng)建索引時加background:true 的選項,讓創(chuàng)建工作在后臺執(zhí)行
8.MongoDB 聚合
MongoDB中聚合(aggregate)主要用于處理數(shù)據(jù)(諸如統(tǒng)計平均值,求和等),并返回計算后的數(shù)據(jù)結(jié)果。有點類似sql語句中的 count(*)。
aggregate() 方法
MongoDB中聚合的方法使用aggregate()。
語法
aggregate() 方法的基本語法格式如下所示:
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
實例
集合中的數(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)在我們通過以上集合計算每個作者所寫的文章數(shù),使用aggregate()計算結(jié)果如下:
## _id 指定根據(jù)那個屬性分組
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
}
以上實例類似sql語句: select by_user, count(*) from mycol group by by_user
在上面的例子中,我們通過字段by_user字段對數(shù)據(jù)進行分組,并計算by_user字段相同值的總和。
下表展示了一些聚合的表達式:
管道的概念
管道在Unix和Linux中一般用于將當前命令的輸出結(jié)果作為下一個命令的參數(shù)。
MongoDB的聚合管道將MongoDB文檔在一個管道處理完畢后將結(jié)果傳遞給下一個管道處理。管道操作是可以重復(fù)的。
表達式:處理輸入文檔并輸出。表達式是無狀態(tài)的,只能用于計算當前聚合管道的文檔,不能處理其它的文檔。
這里我們介紹一下聚合框架中常用的幾個操作:
project:修改輸入文檔的結(jié)構(gòu)??梢杂脕碇孛?、增加或刪除域,也可以用于創(chuàng)建計算結(jié)果以及嵌套文檔。 p r o j e c t : 修 改 輸 入 文 檔 的 結(jié) 構(gòu) 。 可 以 用 來 重 命 名 、 增 加 或 刪 除 域 , 也 可 以 用 于 創(chuàng) 建 計 算 結(jié) 果 以 及 嵌 套 文 檔 。 match:用于過濾數(shù)據(jù),只輸出符合條件的文檔。 match使用MongoDB的標準查詢操作。 m a t c h 使 用 M o n g o D B 的 標 準 查 詢 操 作 。 limit:用來限制MongoDB聚合管道返回的文檔數(shù)。
skip:在聚合管道中跳過指定數(shù)量的文檔,并返回余下的文檔。 s k i p : 在 聚 合 管 道 中 跳 過 指 定 數(shù) 量 的 文 檔 , 并 返 回 余 下 的 文 檔 。 unwind:將文檔中的某一個數(shù)組類型字段拆分成多條,每條包含數(shù)組中的一個值。
group:將集合中的文檔分組,可用于統(tǒng)計結(jié)果。 g r o u p : 將 集 合 中 的 文 檔 分 組 , 可 用 于 統(tǒng) 計 結(jié) 果 。 sort:將輸入文檔排序后輸出。
$geoNear:輸出接近某一地理位置的有序文檔。
管道操作符實例
1、$project實例
db.article.aggregate(
{ $project : {
title : 1 ,
author : 1 ,
}}
);
這樣的話結(jié)果中就只還有_id,tilte和author三個字段了,默認情況下_id字段是被包含的,如果要想不包含_id話可以這樣:
db.article.aggregate(
{ $project : {
_id : 0 ,
title : 1 ,
author : 1
}});
2.$match實例
db.articles.aggregate( [
{ $match : { score : { $gt : 70, $lte : 90 } } },
{ $group: { _id: null, count: { $sum: 1 } } }
] );
$match用于獲取分數(shù)大于70小于或等于90記錄,然后將符合條件的記錄送到下一階段$group管道操作符進行處理。
3.$skip實例
db.article.aggregate(
{ $skip : 5 });
經(jīng)過$skip管道操作符處理后,前五個文檔被"過濾"掉。
四 Python操作MongoDB
安裝PyMongo模塊
使用MongoClient建立連接
from pymongo import MongoClient
#鏈接格式
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
mongodb:// 這是固定的格式,必須要指定。
username:password@ 可選項,如果設(shè)置,在連接數(shù)據(jù)庫服務(wù)器之后,驅(qū)動都會嘗試登陸這個數(shù)據(jù)庫
host1 必須的指定至少一個host, host1 是這個URI唯一要填寫的。它指定了要連接服務(wù)器的地址。如果要連接復(fù)制集,請指定多個主機地址。
portX 可選的指定端口,如果不填,默認為27017
/database 如果指定username:password@,連接并驗證登陸指定數(shù)據(jù)庫。若不指定,默認打開 test 數(shù)據(jù)庫。
?options 是連接選項。如果不使用/database,則前面需要加上/。所有連接選項都是鍵值對name=value,鍵值對之間通過或;(分號)隔開
# 以下為三種建立無驗證連接的方式
#client = MongoClient()
#client = MongoClient('localhost', 27017)
#client = MongoClient('mongodb://localhost:27017/')
#建立驗證連接
使用用戶 admin 使用密碼 123456 連接到本地的 MongoDB 服務(wù)上。輸出結(jié)果如下所示:
> mongodb://admin:123456@localhost/
...
使用用戶名和密碼連接登陸到指定數(shù)據(jù)庫,格式如下:
mongodb://admin:123456@localhost/test
獲取數(shù)據(jù)庫
# 以下是兩種獲取數(shù)據(jù)庫的方式
db = client.pythondb
db = client['python-db']
獲取集合
# 以下是兩種獲取集合的方式
collection = db.python_collection
collection = db['python-collection']
上述任何命令都沒有在MongoDB服務(wù)器上實際執(zhí)行任何操作。當?shù)谝粋€文檔插入集合時才創(chuàng)建集合和數(shù)據(jù)庫。
插入文檔
#!/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
# 查找單個文檔
print(posts.find_one())
# 查找多個文檔
for post in posts.find():
print(post)
# 計數(shù)統(tǒng)計
print(posts.count())
print(posts.find({"author": "Maxsu"}).count())
到此這篇關(guān)于MongoDB安裝使用并實現(xiàn)Python操作數(shù)據(jù)庫 的文章就介紹到這了,更多相關(guān)MongoDB安裝使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- 使用python向MongoDB插入時間字段的操作
- 如何用python 操作MongoDB數(shù)據(jù)庫
- 用Python實現(xiàn)定時備份Mongodb數(shù)據(jù)并上傳到FTP服務(wù)器
- python連接mongodb數(shù)據(jù)庫操作數(shù)據(jù)示例
- python爬蟲用mongodb的理由
- python爬蟲數(shù)據(jù)保存到mongoDB的實例方法
- Python MongoDB 插入數(shù)據(jù)時已存在則不執(zhí)行,不存在則插入的解決方法
- Python操作Mongodb數(shù)據(jù)庫的方法小結(jié)
- Python 操作 MongoDB 講解詳細