溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MongoDB是什么,優(yōu)缺點(diǎn)有哪些

發(fā)布時(shí)間:2020-08-07 09:52:53 來源:億速云 閱讀:325 作者:小新 欄目:編程語(yǔ)言

小編給大家分享一下MongoDB是什么,優(yōu)缺點(diǎn)有哪些,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

一、什么是MongoDB ?

MongoDB 是由C++語(yǔ)言編寫的,是一個(gè)基于分布式文件存儲(chǔ)的開源數(shù)據(jù)庫(kù)系統(tǒng)。

在高負(fù)載的情況下,添加更多的節(jié)點(diǎn),可以保證服務(wù)器性能。

MongoDB 旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。

MongoDB 將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔,數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對(duì)組成。

MongoDB 文檔類似于 JSON 對(duì)象。字段值可以包含其他文檔,數(shù)組及文檔數(shù)組。

MongoDB是什么,優(yōu)缺點(diǎn)有哪些

二、MongoDB 優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

·文檔結(jié)構(gòu)的存儲(chǔ)方式,能夠更便捷的獲取數(shù)據(jù)

·內(nèi)置GridFS,支持大容量的存儲(chǔ)

·海量數(shù)據(jù)下,性能優(yōu)越

·動(dòng)態(tài)查詢

·全索引支持,擴(kuò)展到內(nèi)部對(duì)象和內(nèi)嵌數(shù)組

·查詢記錄分析

·快速,就地更新

·高效存儲(chǔ)二進(jìn)制大對(duì)象 (比如照片和視頻)

·復(fù)制(復(fù)制集)和支持自動(dòng)故障恢復(fù)

·內(nèi)置 Auto- Sharding 自動(dòng)分片支持云級(jí)擴(kuò)展性,分片簡(jiǎn)單

·MapReduce 支持復(fù)雜聚合

·商業(yè)支持,培訓(xùn)和咨詢

缺點(diǎn)

·不支持事務(wù)操作

·MongoDB 占用空間過大 (不過這個(gè)確定對(duì)于目前快速下跌的硬盤價(jià)格來說,也不算什么缺點(diǎn)了)

·MongoDB沒有如MySQL那樣成熟的維護(hù)工具

·無法進(jìn)行關(guān)聯(lián)表查詢,不適用于關(guān)系多的數(shù)據(jù)

·復(fù)雜聚合操作通過mapreduce創(chuàng)建,速度慢

·模式自由,自由靈活的文件存儲(chǔ)格式帶來的數(shù)據(jù)錯(cuò)

·MongoDB 在你刪除記錄后不會(huì)在文件系統(tǒng)回收空間。除非你刪掉數(shù)據(jù)庫(kù)。但是空間沒有被浪費(fèi)

三、優(yōu)缺點(diǎn)詳細(xì)解釋

1.內(nèi)置GridFS,支持大容量的存儲(chǔ):

GridFS是一個(gè)出色的分布式文件系統(tǒng),可以支持海量的數(shù)據(jù)存儲(chǔ)。

內(nèi)置了GridFS了MongoDB,能夠滿足對(duì)大數(shù)據(jù)集的快速范圍查詢。

2.內(nèi)置 Auto- Sharding 自動(dòng)分片支持云級(jí)擴(kuò)展性,分片簡(jiǎn)單

提供基于Range的Auto Sharding機(jī)制:

一個(gè)collection可按照記錄的范圍,分成若干個(gè)段,切分到不同的Shard上。

Shards可以和復(fù)制結(jié)合,配合Replica sets能夠?qū)崿F(xiàn)Sharding+fail-over,不同的Shard之間可以負(fù)載均衡。

查詢是對(duì)客戶端是透明的??蛻舳藞?zhí)行查詢,統(tǒng)計(jì),MapReduce等操作,這些會(huì)被MongoDB自動(dòng)路由到后端的數(shù)據(jù)節(jié)點(diǎn)。

這讓我們關(guān)注于自己的業(yè)務(wù),適當(dāng)?shù)?時(shí)候可以無痛的升級(jí)。MongoDB的Sharding設(shè)計(jì)能力最大可支持約20 petabytes,足以支撐一般應(yīng)用。

這可以保證MongoDB運(yùn)行在便宜的PC服務(wù)器集群上。PC集群擴(kuò)充起來非常方便并且成本很低,避免了“sharding”操作的復(fù)雜性和成本。

3.海量數(shù)據(jù)下,性能優(yōu)越:

在使用場(chǎng)合下,千萬(wàn)級(jí)別的文檔對(duì)象,近10G的數(shù)據(jù),對(duì)有索引的ID的查詢不會(huì)比mysql慢,而對(duì)非索引字段的查詢,則是全面勝出。 mysql實(shí)際無法勝任大數(shù)據(jù)量下任意字段的查詢,而mongodb的查詢性能實(shí)在讓我驚訝。寫入性能同樣很令人滿意,同樣寫入百萬(wàn)級(jí)別的數(shù) 據(jù),mongodb比我以前試用過的couchdb要快得多,基本10分鐘以下可以解決。補(bǔ)上一句,觀察過程中mongodb都遠(yuǎn)算不上是CPU殺手。

4.全索引支持,擴(kuò)展到內(nèi)部對(duì)象和內(nèi)嵌數(shù)組

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

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

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

5.MapReduce 支持復(fù)雜聚合

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

關(guān)系型數(shù)據(jù)庫(kù)相比,MongoDB的缺點(diǎn):

mongodb不支持事務(wù)操作:

所以事務(wù)要求嚴(yán)格的系統(tǒng)(如果銀行系統(tǒng))肯定不能用它。

mongodb不支持事務(wù)操作:

所以事務(wù)要求嚴(yán)格的系統(tǒng)(如果銀行系統(tǒng))肯定不能用它。

mongodb占用空間過大:

關(guān)于其原因,在官方的FAQ中,提到有如下幾個(gè)方面:

1、空間的預(yù)分配:為避免形成過多的硬盤碎片,mongodb每次空間不足時(shí)都會(huì)申請(qǐng)生成一大塊的硬盤空間,而且申請(qǐng)的量從64M、128M、256M那 樣的指數(shù)遞增,直到2G為單個(gè)文件的最大體積。隨著數(shù)據(jù)量的增加,你可以在其數(shù)據(jù)目錄里看到這些整塊生成容量不斷遞增的文件。

2、字段名所占用的空間:為了保持每個(gè)記錄內(nèi)的結(jié)構(gòu)信息用于查詢,mongodb需要把每個(gè)字段的key-value都以BSON的形式存儲(chǔ),如果 value域相對(duì)于key域并不大,比如存放數(shù)值型的數(shù)據(jù),則數(shù)據(jù)的overhead是最大的。一種減少空間占用的方法是把字段名盡量取短一些,這樣占用 空間就小了,但這就要求在易讀性與空間占用上作為權(quán)衡了。

3、刪除記錄不釋放空間:這很容易理解,為避免記錄刪除后的數(shù)據(jù)的大規(guī)模挪動(dòng),原記錄空間不刪除,只標(biāo)記“已刪除”即可,以后還可以重復(fù)利用。

4、可以定期運(yùn)行db.repairDatabase()來整理記錄,但這個(gè)過程會(huì)比較緩慢。

MongoDB沒有如MySQL那樣成熟的維護(hù)工具,這對(duì)于開發(fā)和IT運(yùn)營(yíng)都是個(gè)值得注意的地方。

四、安裝與使用

MongoDB 3.6不支持Ubuntu 12.04

本文使用:Ubuntu 16.04 x64

安裝MongoDB的企業(yè)版

1. 導(dǎo)入公鑰

導(dǎo)入包管理系統(tǒng)使用的公鑰。

Ubuntu軟件包管理工具(即dpkg和apt)通過要求分發(fā)者使用GPG密鑰簽署軟件包來確保軟件包的一致性和真實(shí)性,使用以下命令導(dǎo)入。

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

2. 創(chuàng)建列表文件

echo "deb [ arch=amd64,arm64,ppc64el,s390x ] http://repo.mongodb.com/apt/ubuntu xenial/mongodb-enterprise/3.6 
multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-enterprise.list

3. 更新倉(cāng)庫(kù)

echo apt-get update

4. 安裝服務(wù)

安裝MongoDB Enterprise軟件包

安裝MongoDB企業(yè)版本3.6

sudo apt-get install -y mongodb-enterprise

指定 3.6.2 版本安裝 MongoDB Enterprise

sudo apt-get install -y mongodb-org=3.6.2 mongodb-org-server=3.6.2 mongodb-org-shell=3.6.2 mongodb-org-mongos
=3.6.2 
mongodb-org-tools=3.6.2

5. 啟動(dòng)服務(wù)

service mongod start

6. 查看日志

確認(rèn)MongoDB已經(jīng)成功啟動(dòng),查看/var/log/mongodb/mongod.log 日志

less /var/log/mongodb/mongod.log

驗(yàn)證 mongod 已成功啟動(dòng),通過檢查日志文件的內(nèi)容

[initandlisten] waiting for connections on port 27017

<port>是mongod監(jiān)聽的端口。如果您修改了 配置文件中的net.port設(shè)置/etc/mongod.conf,端口可能會(huì)有所不同。

您可能會(huì)在mongod 輸出中看到非嚴(yán)重警告。只要你看到上面顯示的日志行,你可以放心地忽略這些警告。

五、MongoDB 使用

1. 連接 MongoDB

mongo在同一臺(tái)主機(jī)上啟動(dòng)一個(gè)shell mongod。使用--host命令行選項(xiàng)指定mongod 監(jiān)聽的本地主機(jī)地址和端口:

mongo --host 127.0.0.1:27017
MongoDB shell version v3.6.2
connecting to: mongodb://127.0.0.1:27017/
MongoDB server version: 3.6.2
Server has startup warnings: 
2018-01-25T12:42:31.472+0000 I STORAGE  [initandlisten] 
2018-01-25T12:42:31.473+0000 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly 
recommended 
with the WiredTiger storage engine
2018-01-25T12:42:31.473+0000 I STORAGE  [initandlisten] ** See http://dochub.mongodb.org/core/prodnotes- 
filesystem
2018-01-25T12:42:31.510+0000 I CONTROL  [initandlisten] 
2018-01-25T12:42:31.510+0000 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for 
the database.
2018-01-25T12:42:31.510+0000 I CONTROL  [initandlisten] ** Read and write access to data and 
configuration is 
unrestricted.
2018-01-25T12:42:31.510+0000 I CONTROL  [initandlisten] 
2018-01-25T12:42:31.511+0000 I CONTROL  [initandlisten] 
2018-01-25T12:42:31.511+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled
is 
'always'.
2018-01-25T12:42:31.511+0000 I CONTROL  [initandlisten] ** We suggest setting it to 'never'
2018-01-25T12:42:31.511+0000 I CONTROL  [initandlisten] 
2018-01-25T12:42:31.511+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag
 is 
'always'.
2018-01-25T12:42:31.511+0000 I CONTROL  [initandlisten] ** We suggest setting it to 'never'
2018-01-25T12:42:31.511+0000 I CONTROL  [initandlisten] 
> 1+1
2

上面簡(jiǎn)單測(cè)試了:1+1

退出:Ctrl+c

2. MongoDB 創(chuàng)建數(shù)據(jù)庫(kù)

語(yǔ)法

use DATABASE_NAME

創(chuàng)建一個(gè) souyunku 的數(shù)據(jù)庫(kù),使用 db 命令查看

> use souyunku
switched to db souyunku
> db
souyunku
>

查看所有數(shù)據(jù)庫(kù)使用show dbs

> show dbs
admin   0.000GB
config   0.000GB
local   0.000GB
test    0.000GB
>

可以看到,剛創(chuàng)建的數(shù)據(jù)庫(kù) souyunku 并不在數(shù)據(jù)庫(kù)的列表中, 要顯示它,我們需要向 souyunku 數(shù)據(jù)庫(kù)插入一些數(shù)據(jù)。

> db.souyunku.insert({"name":"關(guān)注公眾號(hào),搜云庫(kù),專注于開發(fā)技術(shù)的研究與知識(shí)分享"})
WriteResult({ "nInserted" : 1 })
> show dbs
admin     0.000GB
config     0.000GB
local     0.000GB
souyunku    0.000GB
test      0.000GB
>

MongoDB 中默認(rèn)的數(shù)據(jù)庫(kù)為 test,如果你沒有創(chuàng)建新的數(shù)據(jù)庫(kù),集合將存放在 test 數(shù)據(jù)庫(kù)中。

3. MongoDB 刪除數(shù)據(jù)庫(kù)

MongoDB 刪除數(shù)據(jù)庫(kù)的語(yǔ)法

db.dropDatabase()

實(shí)例

以下操作會(huì)把souyunku 數(shù)據(jù)刪除

查看所有數(shù)據(jù)庫(kù)

> show dbs
admin     0.000GB
config    0.000GB
local     0.000GB
souyunku   0.000GB
test     0.000GB

切換到souyunku 數(shù)據(jù)庫(kù)

> use souyunku
switched to db souyunku

使用db.dropDatabase() 刪除數(shù)據(jù)庫(kù)

> db.dropDatabase()
{ "dropped" : "souyunku", "ok" : 1 }

看到已經(jīng)刪除了

> show dbs
admin   0.000GB
config   0.000GB
local    0.000GB
test    0.000GB
>

4. MongoDB 插入文檔

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

db.COLLECTION_NAME.insert(document)

以下文檔可以存儲(chǔ)在 MongoDB 的 souyunku數(shù)據(jù)庫(kù) 的 col 集合中:

切換到souyunku 數(shù)據(jù)庫(kù)

> use souyunku
switched to db souyunku
db.col.insert({title: 'MongoDB 教程', 
    description: 'MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)',
    by: '搜云庫(kù)教程-專注于開發(fā)技術(shù)的研究與知識(shí)分享',
    url: 'http://www.souyunku.com',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
})
> db.col.find()

以上實(shí)例中 col 是我們的集合名,如果該集合不在該數(shù)據(jù)庫(kù)中, MongoDB 會(huì)自動(dòng)創(chuàng)建該集合并插入文檔。

查看已插入文檔:

響應(yīng)

{
"_id": ObjectId("5a69eb32ec3046ee8ae54dbb"),
"title": "MongoDB 教程",
"description": "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)",
"by": "搜云庫(kù)教程-專注于開發(fā)技術(shù)的研究與知識(shí)分享",
"url": "http://www.souyunku.com",
"tags": ["mongodb", "database", "NoSQL"],
"likes": 100
}
>

我們也可以將數(shù)據(jù)定義為一個(gè)變量,如下所示:

document=({title: 'MongoDB 教程', 
    description: 'MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)',
    by: '搜云庫(kù)教程-專注于開發(fā)技術(shù)的研究與知識(shí)分享',
    url: 'http://www.souyunku.com',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
})

執(zhí)行后顯示結(jié)果如下:

{
"title" : "MongoDB 教程",
"description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)",
"by" : "搜云庫(kù)教程-專注于開發(fā)技術(shù)的研究與知識(shí)分享",
"url" : "http://www.souyunku.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}

執(zhí)行插入操作:

> db.col.insert(document)
WriteResult({ "nInserted" : 1 })
>

插入文檔你也可以使用 db.col.save(document) 命令。如果不指定 _id 字段 save() 方法類似于 insert() 方法。如果指定 _id 字段,則會(huì)更新該 _id 的數(shù)據(jù)。

3.2 版本后還有以下幾種語(yǔ)法可用于插入文檔:

db.collection.insertOne():向指定集合中插入一條文檔數(shù)據(jù)。

db.collection.insertMany():向指定集合中插入多條文檔數(shù)據(jù)。

插入單條數(shù)據(jù)

> var document = db.collection.insertOne({"title": "搜云庫(kù)"})
> document
{
"acknowledged" : true,
"insertedId" : ObjectId("5a69f0dfec3046ee8ae54dbe")
}
> db.collection.find()
{ "_id" : ObjectId("5a69f0dfec3046ee8ae54dbe"), "title" : "搜云庫(kù)" }
>

插入多條數(shù)據(jù)

> var res = db.collection.insertMany([{"title": "搜云庫(kù)"}, {'description': "關(guān)注公眾號(hào),搜云庫(kù),專注于開發(fā)技術(shù)的
研究與知識(shí)分享"}])
> res
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("5a69f188ec3046ee8ae54dbf"),
ObjectId("5a69f188ec3046ee8ae54dc0")
]
}
> db.collection.find()
{ "_id" : ObjectId("5a69f0dfec3046ee8ae54dbe"), "title" : "搜云庫(kù)" }
{ "_id" : ObjectId("5a69f188ec3046ee8ae54dc0"), "description" : "關(guān)注公眾號(hào),搜云庫(kù),專注于開發(fā)技術(shù)的研究與
知識(shí)分享" }
>

5. MongoDB 刪除文檔

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

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

remove() 方法已經(jīng)過時(shí)了,現(xiàn)在官方推薦使用 deleteOne() 和 deleteMany() 方法。

如刪除集合下全部文檔:

> db.col.deleteMany({})
{ "acknowledged" : true, "deletedCount" : 2 }
> db.col.find()
>

刪除 title 等于 “搜云庫(kù)” 的全部文檔:

> db.collection.deleteMany({ title : "搜云庫(kù)"})
{ "acknowledged" : true, "deletedCount" : 2 }
> 
> db.collection.find()
{ "_id" : ObjectId("5a69f188ec3046ee8ae54dc0"), "description" : "關(guān)注公眾號(hào),搜云庫(kù),專注于開發(fā)技術(shù)的研究與
知識(shí)分享" }
>

刪除 weixin 等于 “souyunku” 的一個(gè)文檔:

> db.col.insert({weixin:"souyunku"})
WriteResult({ "nInserted" : 1 })
> db.col.find()
{ "_id" : ObjectId("5a69f5a0ec3046ee8ae54dc1"), "weixin" : "souyunku" }
> db.col.deleteOne({weixin:"souyunku"})
{ "acknowledged" : true, "deletedCount" : 1 }
> db.col.find()
>

6. MongoDB 查詢文檔

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

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

語(yǔ)法

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

> db.collection.find(query, projection)

·query :可選,使用查詢操作符指定查詢條件

·projection :可選,使用投影操作符指定返回的鍵。查詢時(shí)返回文檔中所有鍵值, 只需省略該參數(shù)即可(默認(rèn)省略)。

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

db.col.insert({title: 'MongoDB 教程', 
    description: 'MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)',
    by: '搜云庫(kù)教程-專注于開發(fā)技術(shù)的研究與知識(shí)分享',
    url: 'http://www.souyunku.com',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
})
> db.col.find().pretty()
{
"_id" : ObjectId("5a69f93598891b4abe9cc8cb"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)",
"by" : "搜云庫(kù)教程-專注于開發(fā)技術(shù)的研究與知識(shí)分享",
"url" : "http://www.souyunku.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}

MongoDB 與 RDBMS Where 語(yǔ)句比較

MongoDB是什么,優(yōu)缺點(diǎn)有哪些

6.1 MongoDB AND 條件

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

語(yǔ)法格式如下:

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

實(shí)例

以下實(shí)例通過 by 和 title 鍵來查詢數(shù)據(jù):

> db.col.find({"by":"搜云庫(kù)教程-專注于開發(fā)技術(shù)的研究與知識(shí)分享", "title":"MongoDB 教程"}).pretty()
{
"_id" : ObjectId("5a69f93598891b4abe9cc8cb"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)",
"by" : "搜云庫(kù)教程-專注于開發(fā)技術(shù)的研究與知識(shí)分享",
"url" : "http://www.souyunku.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}

以上實(shí)例中類似于 WHERE 語(yǔ)句:WHERE by=‘搜云庫(kù)教程-專注于開發(fā)技術(shù)的研究與知識(shí)分享’ AND title=‘MongoDB 教程’

6.2 MongoDB OR 條件

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

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

實(shí)例

以下實(shí)例中,我們演示了查詢鍵 by 值為 “搜云庫(kù)教程-專注于開發(fā)技術(shù)的研究與知識(shí)分享” 或鍵 title 值為 MongoDB 教程 的文檔。

> db.col.find({$or:[{"by":"搜云庫(kù)教程-專注于開發(fā)技術(shù)的研究與知識(shí)分享"},{"title": "MongoDB 教程"}]}).pretty()
{
"_id" : ObjectId("5a69f93598891b4abe9cc8cb"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)",
"by" : "搜云庫(kù)教程-專注于開發(fā)技術(shù)的研究與知識(shí)分享",
"url" : "http://www.souyunku.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
>

6.3 AND 和 OR 聯(lián)合使用

以下實(shí)例演示了 AND 和 OR 聯(lián)合使用,類似常規(guī) SQL 語(yǔ)句為: 'where likes>50 AND (by = '搜云庫(kù)教程-專注于開發(fā)技術(shù)的研究與知識(shí)分享' OR title = 'MongoDB 教程')'

> db.col.find({"likes": {$gt:50}, $or: [{"by": "搜云庫(kù)教程-專注于開發(fā)技術(shù)的研究與知識(shí)分享"},{"title": 
"MongoDB 教程"}]}).pretty()
{
"_id" : ObjectId("5a69f93598891b4abe9cc8cb"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)",
"by" : "搜云庫(kù)教程-專注于開發(fā)技術(shù)的研究與知識(shí)分享",
"url" : "http://www.souyunku.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
>

7. MongoDB 條件操作符

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

MongoDB中條件操作符有:

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

清空集合數(shù)據(jù):

db.col.remove({})

插入以下數(shù)據(jù):

> db.col.insert({
    title: '測(cè)試數(shù)據(jù)200', 
    description: '關(guān)注公眾號(hào),搜云庫(kù),專注于開發(fā)技術(shù)的研究與知識(shí)分享',
    by: '搜云庫(kù)',
    url: 'http://www.souyunku.com',
    tags: ['test'],
    likes: 200
})
> db.col.insert({
title: '測(cè)試數(shù)據(jù)150', 
    description: '關(guān)注公眾號(hào),搜云庫(kù),專注于開發(fā)技術(shù)的研究與知識(shí)分享',
    by: '搜云庫(kù)',
    url: 'http://www.souyunku.com',
    tags: ['test'],
    likes: 150
})
> db.col.insert({
title: '測(cè)試數(shù)據(jù)100', 
    description: '關(guān)注公眾號(hào),搜云庫(kù),專注于開發(fā)技術(shù)的研究與知識(shí)分享',
    by: '搜云庫(kù)',
    url: 'http://www.souyunku.com',
    tags: ['test'],
    likes: 100
})

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

> db.col.find()
{ "_id" : ObjectId("5a6a083598891b4abe9cc8cc"), "title" : "測(cè)試數(shù)據(jù)200", "description" : "關(guān)注公眾號(hào),
搜云庫(kù),專注于開發(fā)技術(shù)的研究與知識(shí)分享", "by" : "搜云庫(kù)", "url" : "http://www.souyunku.com", "tags" : 
[ "test" ], 
"likes" : 200 }
{ "_id" : ObjectId("5a6a083e98891b4abe9cc8cd"), "title" : "測(cè)試數(shù)據(jù)150", "description" : "關(guān)注公眾號(hào),
搜云庫(kù),專注于開發(fā)技術(shù)的研究與知識(shí)分享", "by" : "搜云庫(kù)", "url" : "http://www.souyunku.com", "tags" : 
[ "test" ], 
"likes" : 150 }
{ "_id" : ObjectId("5a6a084498891b4abe9cc8ce"), "title" : "測(cè)試數(shù)據(jù)100", "description" : "關(guān)注公眾號(hào),
搜云庫(kù),專注于開發(fā)技術(shù)的研究與知識(shí)分享", "by" : "搜云庫(kù)", "url" : "http://www.souyunku.com", "tags" : 
[ "test" ], 
"likes" : 100 }
>

7.1 MongoDB (>) 大于操作符 - $gt

db.col.find({"likes" : {$gt : 100}})

類似于SQL語(yǔ)句:

select * from col where likes > 100;

輸出結(jié)果:

{ "_id" : ObjectId("5a6a083598891b4abe9cc8cc"), "title" : "測(cè)試數(shù)據(jù)200", "description" : "關(guān)注公眾號(hào),
搜云庫(kù),專注于開發(fā)技術(shù)的研究與知識(shí)分享", "by" : "搜云庫(kù)", "url" : "http://www.souyunku.com", "tags" : 
[ "test" ], 
"likes" : 200 }
{ "_id" : ObjectId("5a6a083e98891b4abe9cc8cd"), "title" : "測(cè)試數(shù)據(jù)150", "description" : "關(guān)注公眾號(hào),
搜云庫(kù),專注于開發(fā)技術(shù)的研究與知識(shí)分享", "by" : "搜云庫(kù)", "url" : "http://www.souyunku.com", "tags" : 
[ "test" ], 
"likes" : 150 }
>

7.2 MongoDB(>=)大于等于操作符 - $gte

如果你想獲取"col"集合中 “l(fā)ikes” 大于等于 100 的數(shù)據(jù),你可以使用以下命令:

db.col.find({likes : {$gte : 100}})

類似于SQL語(yǔ)句:

select * from col where likes >=100;

輸出結(jié)果:

{ "_id" : ObjectId("5a6a083598891b4abe9cc8cc"), "title" : "測(cè)試數(shù)據(jù)200", "description" : "關(guān)注公眾號(hào),
搜云庫(kù),專注于開發(fā)技術(shù)的研究與知識(shí)分享", "by" : "搜云庫(kù)", "url" : "http://www.souyunku.com", "tags" : 
[ "test" ], 
"likes" : 200 }
{ "_id" : ObjectId("5a6a083e98891b4abe9cc8cd"), "title" : "測(cè)試數(shù)據(jù)150", "description" : "關(guān)注公眾號(hào),
搜云庫(kù),專注于開發(fā)技術(shù)的研究與知識(shí)分享", "by" : "搜云庫(kù)", "url" : "http://www.souyunku.com", "tags" : 
[ "test" ], 
"likes" : 150 }
{ "_id" : ObjectId("5a6a084498891b4abe9cc8ce"), "title" : "測(cè)試數(shù)據(jù)100", "description" : "關(guān)注公眾號(hào),
搜云庫(kù),專注于開發(fā)技術(shù)的研究與知識(shí)分享", "by" : "搜云庫(kù)", "url" : "http://www.souyunku.com", "tags" : 
[ "test" ], 
"likes" : 100 }
>

7.3 MongoDB (<) 小于操作符 - $lt

如果你想獲取"col"集合中 “l(fā)ikes” 小于 150 的數(shù)據(jù),你可以使用以下命令:

db.col.find({likes : {$lt : 150}})

類似于SQL語(yǔ)句:

select * from col where likes < 150;

輸出結(jié)果:

> db.col.find({likes : {$lt : 150}})
{ "_id" : ObjectId("5a6a084498891b4abe9cc8ce"), "title" : "測(cè)試數(shù)據(jù)100", "description" : "關(guān)注公眾號(hào),
搜云庫(kù),專注于開發(fā)技術(shù)的研究與知識(shí)分享", "by" : "搜云庫(kù)", "url" : "http://www.souyunku.com", "tags" : 
[ "test" ], 
"likes" : 100 }
>

7.4 MongoDB (<=) 小于操作符 - $lte

如果你想獲取"col"集合中 “l(fā)ikes” 小于等于 150 的數(shù)據(jù),你可以使用以下命令:

db.col.find({likes : {$lte : 150}})

類似于SQL語(yǔ)句:

select * from col where likes <= 150;

輸出結(jié)果:

> db.col.find({likes : {$lte : 150}})
{ "_id" : ObjectId("5a6a083e98891b4abe9cc8cd"), "title" : "測(cè)試數(shù)據(jù)150", "description" : "關(guān)注公眾號(hào),
搜云庫(kù),專注于開發(fā)技術(shù)的研究與知識(shí)分享", "by" : "搜云庫(kù)", "url" : "http://www.souyunku.com", "tags" : 
[ "test" ], 
"likes" : 150 }
{ "_id" : ObjectId("5a6a084498891b4abe9cc8ce"), "title" : "測(cè)試數(shù)據(jù)100", "description" : "關(guān)注公眾號(hào),
搜云庫(kù),專注于開發(fā)技術(shù)的研究與知識(shí)分享", "by" : "搜云庫(kù)", "url" : "http://www.souyunku.com", "tags" : 
[ "test" ], 
"likes" : 100 }
>

7.5 MongoDB 使用 (<) 和 (>) 查詢 - $lt 和 $gt

如果你想獲取"col"集合中 “l(fā)ikes” 大于100,小于 200 的數(shù)據(jù),你可以使用以下命令:

db.col.find({likes : {$lt :200, $gt : 100}})

類似于SQL語(yǔ)句:

select * from col where likes>100 AND  likes<200;

輸出結(jié)果:

> db.col.find({likes : {$lt :200, $gt : 100}})
{ "_id" : ObjectId("5a6a083e98891b4abe9cc8cd"), "title" : "測(cè)試數(shù)據(jù)150", "description" : "關(guān)注公眾號(hào),
搜云庫(kù),專注于開發(fā)技術(shù)的研究與知識(shí)分享", "by" : "搜云庫(kù)", "url" : "http://www.souyunku.com", "tags" : 
[ "test" ], 
"likes" : 150 }
>

一些簡(jiǎn)寫說明:

$gt -------- greater than  >
$gte --------- gt equal  >=
$lt -------- less than  <
$lte --------- lt equal  <=
$ne ----------- not equal  !=
$eq  --------  equal  =

看完了這篇文章,相信你對(duì)MongoDB是什么,優(yōu)缺點(diǎn)有哪些有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI