MongoDB 學(xué)習(xí)筆記—基礎(chǔ)篇

首先安裝好 MongoDB 數(shù)據(jù)庫并啟動它喉恋,然后進入用 CMD 命令進入到 ${MONGODB_HOME}/bin 目錄執(zhí)行 mongo 打開 MongoDB 客戶端柱衔。

連接 MongoDB、數(shù)據(jù)庫操作、集合操作

連接 MongoDB

mongo ip:port/dbName -u username -p password

例如:mongo 127.0.0.1:27017/test -u test -p test

連接 MongoDB

mongouse dbNamedb.auth("username", "password")

查看當(dāng)前數(shù)據(jù)庫版本

db.version()

查看當(dāng)前數(shù)據(jù)庫狀態(tài)

db.stats()

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

show dbs

查看所有集合

show tables或show collections

查看當(dāng)前所在數(shù)據(jù)庫

db

使用數(shù)據(jù)庫

use dbName

刪除當(dāng)前正在使用的數(shù)據(jù)庫

db.dropDatabase()

創(chuàng)建集合

db.createCollection("collectionName")

刪除集合

db.collectionName.drop()

MongoDB 備份谢翎、恢復(fù)數(shù)據(jù)庫

導(dǎo)出

mongodump -h ip:port -d dbName -u username -p password -o dumpDir

-h:MongDB 所在服務(wù)器地址(如:127.0.0.1),也可以指定端口號(如:127.0.0.1:27017)-d:需要備份的數(shù)據(jù)庫實例(如:test)-o:備份的數(shù)據(jù)存放位置(如:D:\data\dump)沐旨,該目錄需提前建立森逮,備份完成后會在 D:\data\dump 目錄下建立一個 test 目錄用于存放該數(shù)據(jù)庫實例的備份數(shù)據(jù)。

導(dǎo)入

mongorestore -h ip:port -d dbName dumpDir

--host ip:port磁携、-h ip:port:MongoDB所在服務(wù)器地址(默認是 localhost:27017)--db褒侧、-d:需要恢復(fù)的數(shù)據(jù)庫實例,例如:test谊迄,當(dāng)然這個名稱也可以和備份時候的不一樣闷供,比如test2--drop:恢復(fù)時先刪除當(dāng)前數(shù)據(jù),然后恢復(fù)備份的數(shù)據(jù)统诺。即:恢復(fù)后歪脏,備份操作之后添加、修改的數(shù)據(jù)都會被刪除粮呢!dumpDir:mongorestore 最后的一個參數(shù)婿失,設(shè)置備份數(shù)據(jù)所在位置(如:D:\data\dump\test)。注意:不能同時指定 dumpDir 和 --dir 選項啄寡。--dir:指定備份的目錄豪硅。注意:不能同時指定 dumpDir 和 --dir 選項。

MongoDB 插入文檔

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

db.collectionName.insert(document)

例如:

db.mycol.insert({title : 'MongoDB 教程',? ? description : 'MongoDB 是一個 Nosql 數(shù)據(jù)庫',? ? by : 'php中文網(wǎng)',? ? website : 'http://www.php.cn',? ? tags : ['mongodb', 'database', 'NoSQL'],? ? likes : 100});

也可以將數(shù)據(jù)定義為一個變量:

document=({title : 'MongoDB 教程',? ? description : 'MongoDB 是一個 Nosql 數(shù)據(jù)庫',? ? by : 'php中文網(wǎng)',? ? website : 'http://www.php.cn',? ? tags : ['mongodb', 'database', 'NoSQL'],? ? likes : 100});

再執(zhí)行插入操作:

db.mycol.insert(document)

注意:插入文檔也可以使用 db.collectionName.save(document) 命令懒浮。如果不指定 _id 字段,save() 方法類似于 insert() 方法姻乓;如果指定 _id 字段嵌溢,則會更新該 _id 的數(shù)據(jù)。

db.mycol.save({_id : ObjectId("5ede4968cfd2ea1834cc87c7"),title : 'MongoDB 教程(修改)',? ? description : 'MongoDB 是一個 Nosql 數(shù)據(jù)庫(修改)',? ? by : 'php中文網(wǎng)(修改)',? ? website : 'http://www.php.cn',? ? tags : ['mongodb(修改)', 'database(修改)', 'NoSQL(修改)'],? ? likes : 100});

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

db.collectionName.insertOne(document):向指定集合中插入一個文檔db.collectionName.insertMany(document):向指定集合中插入多個文檔

例1:插入一個文檔

var document = db.mycol.insertOne({"a": 3})

例2:插入多個文檔

var res = db.mycol.insertMany([{"b": 3}, {'c': 4}])

例3:一次插入多條數(shù)據(jù)(先創(chuàng)建數(shù)組蹋岩,再將文檔放在數(shù)組中):

var arr = [];for(var i=1 ; i<=20000 ; i++){? ? arr.push({"num" : i});}db.mycol.insert(arr);

MongoDB 更新文檔

MongoDB 使用 update() 和 save() 方法來更新集合中的文檔赖草。接下來讓我們詳細來看下兩個函數(shù)的應(yīng)用及其區(qū)別。1剪个、update() 方法用于更新已存在的文檔秧骑。語法格式如下:

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

參數(shù)說明:

query:查詢條件,類似于關(guān)系型數(shù)據(jù)庫查詢語句中的 where 條件。

update:更新的操作符或?qū)ο蠛跽郏愃朴陉P(guān)系型數(shù)據(jù)庫修改語句中的 set绒疗。

upsert:可選參數(shù)。當(dāng)不存在符合 query 查詢條件的記錄時是否插入骂澄,true 為插入吓蘑,默認是 false。

multi:可選參數(shù)坟冲。是否更新符合 query 查詢條件的所有記錄磨镶。參數(shù)為 true 時則就把按條件查出來的多條記錄全部更新。默認是 false健提,即只更新找到的第一條記錄琳猫。

writeConcern:可選參數(shù),指定拋出異常的級別私痹。有以下幾種異常級別脐嫂。WriteConcern.NONE:沒有異常拋出。WriteConcern.NORMAL:僅拋出網(wǎng)絡(luò)錯誤異常紊遵,沒有服務(wù)器錯誤異常账千。WriteConcern.SAFE:拋出網(wǎng)絡(luò)錯誤異常、服務(wù)器錯誤異常暗膜;并等待服務(wù)器完成寫操作蕊爵。WriteConcern.MAJORITY:拋出網(wǎng)絡(luò)錯誤異常、服務(wù)器錯誤異常桦山;并等待一個主服務(wù)器完成寫操作攒射。WriteConcern.FSYNC_SAFE:拋出網(wǎng)絡(luò)錯誤異常、服務(wù)器錯誤異常恒水;寫操作等待服務(wù)器將數(shù)據(jù)刷新到磁盤会放。WriteConcern.JOURNAL_SAFE:拋出網(wǎng)絡(luò)錯誤異常、服務(wù)器錯誤異常钉凌;寫操作等待服務(wù)器提交到磁盤的日志文件咧最。WriteConcern.REPLICAS_SAFE:拋出網(wǎng)絡(luò)錯誤異常、服務(wù)器錯誤異常御雕;等待至少2臺服務(wù)器完成寫操作矢沿。

例如:通過 update() 方法來更新標(biāo)題(title)

db.mycol.update({'title' : 'MongoDB 教程'}, {$set : {'title' : 'MongoDB'}})

以上語句只會修改第一條發(fā)現(xiàn)的文檔,如果要修改多個文檔酸纲,則需要設(shè)置 multi 參數(shù)為 true捣鲸,如下:

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

2、save() 方法通過傳入的文檔來替換已有文檔闽坡。語法格式如下:

db.collectionName.save(? <document>,? {? ? writeConcern: <document>? })

參數(shù)說明:

document:文檔數(shù)據(jù)栽惶。

writeConcern:可選參數(shù)愁溜,指定拋出異常的級別。

下例替換 _id 為 56064f89ade2f21f36b03136 的文檔數(shù)據(jù):

db.mycol.save({"_id" : ObjectId("56064f89ade2f21f36b03136"),? ? "title" : "MongoDB",? ? "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫",? ? "by" : "php",? ? "website" : "http://www.php.cn",? ? "tags" : ["mongodb", "NoSQL"],? ? "likes" : 110})

3外厂、使用的 $set 或 $unset 操作符來新增或移除集合中的鍵值對$set 或 $unset 操作符的語法格式如下:

db.collectionName.update(<query>, {$set: {<field1>: "", ...}})db.collectionName.update(<query>, {$unset: {<field1>: "", ...}})

例如:

db.mycol.update({"id" : "56064f89ade2f21f36b03136"}, {$set : {"status" : "ON"}})db.mycol.update({"id" : "56064f89ade2f21f36b03136"}, {$unset : {"status" : "OFF"}})

注:如果指定的字段不存在則操作不做任何處理冕象。

4、Mongodb 字段更新 $setOnInsert 操作符如果 update 的更新參數(shù) upsert 為 true(即:如果要更新的文檔不存在則插入一條新記錄)汁蝶,若要更新的文檔不存在渐扮,$setOnInsert 操作符會將指定的值賦給指定的字段,若要更新的文檔存在掖棉,$setOnInsert 操作符不做任何處理席爽。

db.mycol.update({"title" : 'MongoDB 教程'}, {$setOnInsert : {'title' : 'MongoDB'}}, {upsert : true})

5、MongoDB 更新案例

只更新第一條記錄:

db.mycol.update({"count" : {$gt : 5}}, {$set : {"status" : "OK"}});

全部更新:

db.mycol.update({"count" : {$gt : 5}}, {$set : {"status" : "OK"}}, false, true);

只添加第一條:

db.mycol.update({"count" : {$gt : 5}}, {$set : {"status" : "OK"}}, true, false);

全部添加:

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

全部更新:

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

只更新第一條記錄:

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

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

db.collectionName.updateOne(document):更新指定集合中的單個文檔db.collectionName.updateMany(document):更新指定集合中的多個文檔

例1:更新單個文檔

db.mycol.updateOne({"title" : "abc"}, {$set : {"likes" : "100"}})

例2啊片、更新多個文檔

db.mycol.updateMany({"likes" : {$gt : "10"}}, {$set : {"title" : "xyz"}})

MongoDB 刪除文檔

remove() 方法的基本語法格式如下:

db.collectionName.remove(? <query>,? <justOne>)

如果 MongoDB 是 2.6 版本以后的,語法格式如下:

db.collectionName.remove(? <query>,? {? ? justOne: <boolean>,? ? writeConcern: <document>? })

參數(shù)說明:

query:可選參數(shù)玖像。刪除的文檔的條件紫谷。

justOne:可選參數(shù)。如果設(shè)為 true 或 1捐寥,則只刪除一個文檔笤昨。默認值是 false。

writeConcern:可選參數(shù)握恳。指定拋出異常的級別瞒窒。

remove() 方法 并不會真正釋放空間,需要繼續(xù)執(zhí)行 db.repairDatabase() 來回收磁盤空間乡洼。

db.repairDatabase() 或 db.runCommand({ repairDatabase: 1 })

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

移除 title 為 'MongoDB 教程' 的文檔:

db.mycol.remove({'title':'MongoDB 教程'})

如果只想刪除第一條找到的記錄可以設(shè)置 justOne 為 true 或 1:

db.collectionName.remove(DELETION_CRITERIA, 1)

如果想刪除所有數(shù)據(jù)束昵,可以使用以下方式(類似于關(guān)系型數(shù)據(jù)庫中的 truncate 命令):

db.mycol.remove({})

如刪除集合中的全部文檔:

db.mycol.deleteMany({})

刪除 status 等于 ON 的全部文檔:

db.mycol.deleteMany({"status" : "ON"})

刪除 status 等于 ON 的一個文檔:

db.mycol.deleteOne({"status" : "D"})

MongoDB 查詢文檔

MongoDB 查詢文檔使用 find() 方法拔稳,該方法以非結(jié)構(gòu)化的方式來顯示所有文檔。MongoDB 查詢數(shù)據(jù)的語法格式如下:

db.collectionName.find(query, projection)

還可以使用 pretty() 方法以易讀的方式來讀取數(shù)據(jù)锹雏,語法格式如下:

db.collectionName.find(query, projection).pretty()

參數(shù)說明:

query:可選參數(shù)巴比。使用查詢操作符指定的查詢條件。

projection:可選參數(shù)礁遵。使用投影操作符指定返回的鍵轻绞。查詢時若需返回文檔中所有鍵值,則省略該參數(shù)即可(默認省略)佣耐。projection 的入?yún)⒏袷綖閧"columnA" : 0/1, "columnB" : 0/1}政勃,其中 columnA、columnB 表示要查詢的集合中的字段兼砖,0/1 表示取或不取稼病。

注:若不指定 projection选侨,則默認返回所有鍵;指定 projection 時有兩種模式然走,如下:

db.collectionName.find(query, {"title" : 1, "by" : 1}) // inclusion模式 指定返回的鍵援制,不返回其他鍵db.collectionName.find(query, {"title" : 0, "by" : 0}) // exclusion模式 指定不返回的鍵,返回其他鍵

_id 鍵默認返回,需要主動指定 _id:0 才會隱藏芍瑞。兩種模式不可混用(因為這樣的話無法推斷其他鍵是否應(yīng)返回)晨仑。如下:

db.collection.find(query, {"title" : 1, "by" : 0}) // 錯誤

只能 全1 或 全0,除了在 inclusion 模式時可以指定 _id:0

db.collection.find(query, {"_id" : 0, "title" : 1, "by" : 1}) // 正確

除 find() 方法外拆檬,還有一個 findOne() 方法洪己,它只返回一個文檔。

示例:

查詢集合中的所有文檔

db.mycol.find().pretty();

查詢集合中的所有文檔竟贯,只顯示 _id 和 title 列

db.mycol.find().pretty({}, {'title' : 1});

查詢集合中的所有文檔答捕,只顯示 title 列

db.mycol.find().pretty({}, {'_id' : 0, 'title' : 1});

MongoDB 條件語句查詢:

等于:{<key> : <value>}如:db.mycol.find({"title" : "MongoDB 教程"}).pretty(),相當(dāng)于 RDBMS 中的 where by = 'MongoDB 教程'

不等于:{<key> : {$ne : <value>}}如:db.mycol.find({"likes" : {$ne : 50}}).pretty()屑那,相當(dāng)于 RDBMS 中的 where likes != 50

小于:{<key> : {$lt : <value>}}如:db.mycol.find({"likes" : {$lt : 50}}).pretty()拱镐,相當(dāng)于 RDBMS 中的 where likes < 50

小于等于:{<key> : {$lte : <value>}}如:db.mycol.find({"likes" : {$lte : 50}}).pretty(),相當(dāng)于 RDBMS 中的 where likes <= 50

大于:{<key> : {$gt : <value>}}如:db.mycol.find({"likes" : {$gt : 50}}).pretty()持际,相當(dāng)于 RDBMS 中的 where likes > 50

大于等于:{<key> : {$gte : <value>}}如:db.mycol.find({"likes" : {$gte : 50}}).pretty()沃琅,相當(dāng)于 RDBMS 中的 where likes >= 50

MongoDB 中的 AND 條件:find() 方法可以傳入多個鍵(key),多個鍵(key)之間用逗號隔開蜘欲,即常規(guī) SQL 的 AND 條件益眉。語法格式如下:

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

下例通過 by 和 title 來查詢 MongoDB 中 MongoDB 教程的文檔:

db.mycol.find({"by" : "MongoDB", "title" : "MongoDB 教程"}).pretty()

以上實例類似于 RDBMS 中的 WHERE 語句:WHERE by='菜鳥教程' AND title='MongoDB 教程'

MongoDB 中的 OR 條件:該類型的條件語句需要使用關(guān)鍵字 $or,語法格式如下:

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

下例查詢鍵 by 的值為 MongoDB 或鍵 title 的值為 MongoDB 教程的文檔:

db.mycol.find({$or : [{"by" : "MongoDB"}, {"title" : "MongoDB 教程"}]}).pretty()

MongoDB 中 AND 和 OR 聯(lián)合使用,下例中 AND 和 OR 聯(lián)合使用:

db.mycol.find({"likes" : {$gt : 50}, $or: [{"by" : "MongoDB"}, {"title" : "MongoDB 教程"}]}).pretty()

類似于 RDBMS 中的 WHERE 語句:WHERE likes > 50 AND (by = 'MongoDB' OR title = 'MongoDB 教程')

MongoDB 條件操作符

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

大于(>):$gt

大于等于(>=):$gte

小于(<):$lt

小于等于(<=):$lte

MongoDB? 大于(>)操作符:$gt獲取 mycol 集合中 likes 大于 100 的數(shù)據(jù):

db.mycol.find({"likes" : {$gt : 100}}).pretty()郭脂,類似于 SQL 語句:Select * from mycol where likes > 100;

MongoDB 大于等于(>=)操作符:$gte獲取 mycol 集合中 likes 大于等于 100 的數(shù)據(jù):

db.mycol.find({"likes" : {$gte : 100}}).pretty(),類似于 SQL 語句:Select * from mycol where likes >= 100;

MongoDB? 小于(<)操作符:$lt獲取 mycol 集合中 likes 小于 150 的數(shù)據(jù):

db.mycol.find({"likes" : {$lt : 150}}).pretty()澈歉,類似于SQL語句:Select * from mycol where likes < 150;

MongoDB 小于等于(<=)操作符:$lte獲取 mycol 集合中 likes 小于等于 150 的數(shù)據(jù):

db.mycol.find({"likes" : {$lte : 150}}).pretty()朱庆,類似于SQL語句:Select * from mycol where likes <= 150;

MongoDB 使用小于(<)和大于(>)查詢:$lt、$gt獲取 mycol 集合中 likes 大于 100 小于 200 的數(shù)據(jù):

db.mycol.find({"likes" : {$lt :200, $gt : 100}}).pretty()闷祥,類似于SQL語句:Select * from mycol where likes > 100 AND likes < 200;

MongoDB 模糊查詢

查詢 title 包含"教"字的文檔:

db.mycol.find({"title" : /教/}).pretty()

查詢 title 字段以"教"字開頭的文檔:

db.mycol.find({"title" : /^教/}).pretty()

查詢 titl e字段以"教"字結(jié)尾的文檔:

db.mycol.find({"title" : /教$/}).pretty()

MongoDB 條件操作符 $type

$type 操作符是基于 BSON 類型來檢索集合中匹配的數(shù)據(jù)類型萍桌,并返回結(jié)果砸泛。MongoDB 中可以使用的類型如下所示:

Double —— 1

String —— 2

Object —— 3

Array —— 4

Binary data —— 5

Undefined —— 6(已廢棄)

Object id —— 7

Boolean —— 8

Date —— 9

Null —— 10

Regular Expression —— 11

JavaScript —— 13

Symbol —— 14

JavaScript (with scope) —— 15

32-bit integer —— 16

Timestamp —— 17

64-bit integer —— 18

Min key —— 255(Query with -1)

Max key —— 127

$type 操作符示例獲取 mycol 集合中 title 為 String 的數(shù)據(jù):

db.mycol.find({"title" : {$type : 2}}) 或 db.mycol.find({"title" : {$type : 'string'}})

MongoDB limit() 方法

如果要在 MongoDB 中讀取指定數(shù)量的文檔龙考,可以使用 MongoDB 的 limit() 方法筋现,limit() 方法接受一個數(shù)字參數(shù),該參數(shù)指定要從 MongoDB 中讀取的文檔個數(shù)悟衩。limit() 方法語法格式如下:

db.collectionName.find().limit(number)

下例查詢文檔中的2條記錄:

db.mycol.find({}, {"title" : 1, "_id" : 0}).limit(2)

注:如果沒有指定 limit() 方法中的參數(shù)剧罩,則顯示集合中的所有文檔。

MongoDB Skip() 方法

除了可以使用 limit() 方法來讀取指定數(shù)量的文檔外座泳,還可以用 skip() 方法來跳過指定數(shù)量的文檔惠昔,skip()方法也接受一個數(shù)字參數(shù)作為跳過的文檔個數(shù)幕与。skip() 方法語法格式如下:

db.collectionName.find().limit(number).skip(number)

下例只會顯示第二條文檔數(shù)據(jù):

db.mycol.find({}, {"title" : 1, "_id" : 0}).limit(1).skip(1)

注:skip() 方法默認參數(shù)為0。

MongoDB 排序

在 MongoDB 中使用 sort() 方法對文檔排序镇防,該方法可以通過參數(shù)指定排序的字段啦鸣,并使用 1(升序) 和 -1(降序) 來指定排序的方式。sort() 方法語法格式如下:

db.collectionName.find().sort({KEY : 1})

下例將 mycol 集合中的文檔按字段 likes 的降序排列:

db.mycol.find({}, {"title" : 1, "_id" : 0}).sort({"likes" : -1})

注:skip()来氧、limilt()诫给、sort() 三個一起執(zhí)行時,執(zhí)行的先后順序是 sort()啦扬、skip()中狂、limit()。

MongoDB 索引

索引通常能夠極大的提高查詢效率扑毡,如果沒有索引胃榕,MongoDB 在讀取數(shù)據(jù)時就會掃描集合中的所有文檔并選擇那些符合查詢條件的記錄。這種掃描全集合的查詢效率是非常低的瞄摊,特別在處理大量數(shù)據(jù)時勋又,查詢可能要花費幾十秒甚至幾分鐘,這對網(wǎng)站的性能是非常致命的泉褐。索引是特殊的數(shù)據(jù)結(jié)構(gòu),索引存儲在一個易于遍歷讀取的數(shù)據(jù)集合中鸟蜡,索引是對數(shù)據(jù)庫表中一列或多列的值進行排序的一種結(jié)構(gòu)膜赃。MongoDB 中創(chuàng)建索引的語法格式如下:

db.collectionName.ensureIndex(keys, options) // 3.0.0 版本前db.collectionName.createIndex(keys, options) // 3.0.0 版本后

Keys 為要創(chuàng)建的索引字段,1 指按升序創(chuàng)建索引揉忘,-1 指按降序創(chuàng)建索引跳座。例如:

db.mycol.createIndex({"title" : 1})

也可以設(shè)置多個字段創(chuàng)建索引(即:RDBMS 中的復(fù)合索引)

db.mycol.createIndex({"title" : 1, "description" : -1})

options 為可選參數(shù),可取值為:

background:Boolean 類型泣矛,默認值為 false疲眷。創(chuàng)建索引的過程會阻塞其它數(shù)據(jù)庫操作,background 可指定以后臺方式創(chuàng)建索引您朽。

unique:Boolean 類型狂丝,默認值為 false。建立的索引是否唯一哗总。

name:String 類型几颜。指定索引的名稱。如果未指定讯屈,MongoDB 通過連接索引的字段名和排序順序生成一個索引名稱蛋哭。

dropDups:Boolean 類型,默認值為 false涮母。3.0+ 版本已廢棄谆趾。在建立唯一索引時是否刪除重復(fù)記錄躁愿。

sparse:Boolean 類型,默認值為 false沪蓬。對文檔中不存在的字段數(shù)據(jù)不啟用索引彤钟。如果設(shè)置為 true,則在索引字段中不會查詢出不包含對應(yīng)字段的文檔怜跑。

expireAfterSeconds:Integer類型样勃。指定集合的生存時間,單位為秒性芬。

v:索引的版本號峡眶。默認的索引版本取決于 MongoDB 創(chuàng)建索引時運行的版本。

weights:索引權(quán)重值植锉,數(shù)值在 1 到 99,999 之間辫樱,表示該索引相對于其他索引字段的得分權(quán)重。

default_language:String 類型俊庇,默認為英語狮暑。對于文本索引,該參數(shù)決定了停用詞及詞干和詞器的規(guī)則的列表辉饱。

language_override:String 類型搬男,默認值為 language。對于文本索引彭沼,該參數(shù)指定了包含在文檔中的字段名缔逛,語言覆蓋默認的 language。

在創(chuàng)建索引時加 background:true 選項姓惑,讓創(chuàng)建工作在后臺執(zhí)行:

db.mycol.createIndex({"title" : 1, "likes" : 1}, {background : true})

索引相關(guān)操作

查看集合索引

db.collectionName.getIndexes()

查看集合索引大小

db.collectionName.totalIndexSize()

刪除集合所有索引

db.collectionName.dropIndexes()

刪除集合指定索引

db.collectionName.dropIndex("索引名稱")

利用 TTL 對存儲的數(shù)據(jù)進行失效時間設(shè)置:經(jīng)過指定的時間段后或在指定的時間點過期褐奴,MongoDB 獨立線程去清除數(shù)據(jù)。類似于設(shè)置定時自動刪除任務(wù)于毙,可以清除歷史記錄或日志等前提條件敦冬,設(shè)置 Index 的關(guān)鍵字段為日期類型 new Date()。

例唯沮、數(shù)據(jù)記錄中 createDate 為日期類型脖旱,設(shè)置在創(chuàng)建記錄 180 秒后刪除。:

db.mycol.createIndex({"createDate" : 1}, {expireAfterSeconds : 180})

例介蛉、由記錄中設(shè)定日期點清除夯缺。如設(shè)置某記錄在2020年6月13日12點左右刪除,則該記錄中需添加 "ClearUpDate": new Date('Jun 13, 2020 12:00:00')甘耿,且 Index中expireAfterSeconds 的值設(shè)置為 0踊兜。

db.mycol.createIndex({"ClearUpDate" : 1}, {expireAfterSeconds : 0})

MongoDB 設(shè)置 TTL 時注意事項

索引關(guān)鍵字段必須是 Date 類型。

刪除操作是非立即執(zhí)行的佳恬。MongoDB 中掃描集合過期數(shù)據(jù)并刪除是獨立線程執(zhí)行捏境,默認 60s 掃描一次于游,刪除也不一定是立即刪除成功。

單字段索引垫言,混合索引不支持贰剥。

MongoDB 聚合

MongoDB 中的聚合(aggregate)主要用于處理數(shù)據(jù)(如:統(tǒng)計平均值、求和等)筷频,并返回計算后的結(jié)果蚌成。類似 sql 語句中的 count(*)。MongoDB 中聚合的方法使用 aggregate()凛捏,其語法格式如下:

db.collectionName.aggregate(AGGREGATE_OPERATION)

例担忧、統(tǒng)計每個作者所寫的文章數(shù):

db.mycol.aggregate([{$group : {"_id" : "$by", "num" : {$sum : 1}}}])類似于:select by as _id, count(*) as num from mycol group by by

一些常用聚合表達式

$sum:計算總和。

db.mycol.aggregate([{$group : {"_id" : "$by", "num" : {$sum : "$likes"}}}])

$avg:計算平均值坯癣。

db.mycol.aggregate([{$group : {"_id" : "$by", "num" : {$avg : "$likes"}}}])

$min:獲取集合中所有文檔對應(yīng)值得最小值瓶盛。

db.mycol.aggregate([{$group : {"_id" : "$by", "num" : {$min : "$likes"}}}])

$max:獲取集合中所有文檔對應(yīng)值得最大值。

db.mycol.aggregate([{$group : {"_id" : "$by", "num" : {$max : "$likes"}}}])

$push:在結(jié)果文檔中插入值到一個數(shù)組中示罗。

db.mycol.aggregate([{$group : {"_id" : "$by", "website" : {$push: "$website"}}}])

$addToSet:在結(jié)果文檔中插入值到一個數(shù)組中惩猫,但不創(chuàng)建副本。

db.mycol.aggregate([{$group : {"_id" : "$by", "website" : {$addToSet : "$website"}}}])

$first:根據(jù)資源文檔的排序獲取第一個文檔數(shù)據(jù)蚜点。

db.mycol.aggregate([{$group : {"_id" : "$by", "first_website" : {$first : "$website"}}}])

$last:根據(jù)資源文檔的排序獲取最后一個文檔數(shù)據(jù)轧房。

db.mycol.aggregate([{$group : {"_id" : "$by", "last_website" : {$last : "$website"}}}])

MongoDB 管道

管道在 Unix 和 Linux 中一般用于將當(dāng)前命令的輸出結(jié)果作為下一個命令的參數(shù)。MongoDB 的聚合管道將 MongoDB 文檔在一個管道處理完畢后將結(jié)果傳遞給下一個管道處理绍绘。管道操作是可以重復(fù)的奶镶。表達式:處理輸入文檔并輸出。表達式是無狀態(tài)的脯倒,只能用于計算當(dāng)前聚合管道的文檔实辑,不能處理其它的文檔捺氢。

常用的幾個管道操作

$project:修改輸入文檔的結(jié)構(gòu)藻丢。可以用來重命名摄乒、增加或刪除域悠反,也可以用于創(chuàng)建計算結(jié)果以及嵌套文檔。

$match:用于過濾數(shù)據(jù)馍佑,只輸出符合條件的文檔斋否。$match 使用 MongoDB 的標(biāo)準(zhǔn)查詢操作。

$limit:用來限制 MongoDB 聚合管道返回的文檔數(shù)拭荤。

$skip:在聚合管道中跳過指定數(shù)量的文檔茵臭,并返回余下的文檔。

$unwind:將文檔中的某一個數(shù)組類型字段拆分成多條舅世,每條包含數(shù)組中的一個值旦委。

$group:將集合中的文檔分組奇徒,可用于統(tǒng)計結(jié)果。

$sort:將輸入文檔排序后輸出缨硝。

$geoNear:輸出接近某一地理位置的有序文檔摩钙。

管道操作符實例

$project 實例

db.mycol.aggregate({$project : {"title" : 1, "description" : 1}})

上例結(jié)果中就只有 _id、tilte查辩、description 三個字段了(默認包含 _id 字段)胖笛,如果不想要 _id 字段則可以這樣寫:

db.mycol.aggregate({$project : {"_id" : 0, "title" : 1, "description" : 1}})

$match 實例

db.mycol.aggregate([{$match : {"likes" : {$gt : 10, $lte : 100}}},{$group : {"_id": null, "count": {$sum: 1}}}]);

$match 用于獲取 likes 大于10且小于等于100的記錄,然后將符合條件的記錄送到 $group 管道操作符進行處理宜岛。注意:當(dāng) $match 和 $group 同時存在時长踊,順序會影響檢索結(jié)果,如下:

db.mycol.aggregate([{$match : {"likes" : {$gt : 10, $lte : 100}}},{$group : {"id": null, "count": {$sum: 1}}}]);db.mycol.aggregate([{$group : {"id": null, "count": {$sum: 1}}},{$match : {"likes" : {$gt : 10, $lte : 100}}}]);

$skip 實例

db.mycol.aggregate({$skip : 2});

經(jīng)過 $skip 管道操作符處理后谬返,前2個文檔就被"過濾"掉了之斯。

** 按日、按月遣铝、按年佑刷、按周、按小時酿炸、按分鐘等聚合操作**

db.mycol.aggregate([{$match : {"by" : "runoob", pubDate : {$gt : new Date(2020, 2, 2)}}},{$group : {"id" : {$dayOfMonth : '$pubDate'}, "page_view" : {$sum : 1}}},{$sort : {"id" : 1}}])

時間關(guān)鍵字如下:

$dayOfYear: 返回該日期是這一年的第幾天(全年 366 天)瘫絮。

$dayOfMonth: 返回該日期是這一個月的第幾天(1~31)。

$dayOfWeek: 返回的是這個周的星期幾(1~7:1-星期日填硕、7-星期六)麦萤。

$year: 返回該日期的年份部分。

$month: 返回該日期的月份部分(1~12)扁眯。

$week: 返回該日期是所在年的第幾個星期(0~53)壮莹。

$hour: 返回該日期的小時部分。

$minute: 返回該日期的分鐘部分姻檀。

$second: 返回該日期的秒部分(以0~59之間的數(shù)字形式返回日期的第二部分命满,但可以是60來計算閏秒)。

$millisecond:返回該日期的毫秒部分(0~999)绣版。

$dateToString: 格式化日期時間成字符串胶台。如:

db.mycol.aggregate([{$project : { "pubDate": {$dateToString : {format: "%Y-%m-%d %H:%M:%S", date: "$pubDate"}}, "by" : true }}])

本文參考:

1、https://www.runoob.com/mongodb/mongodb-tutorial.html

2杂抽、https://docs.mongodb.com/manual/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诈唬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子缩麸,更是在濱河造成了極大的恐慌铸磅,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異阅仔,居然都是意外死亡济竹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門霎槐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來送浊,“玉大人,你說我怎么就攤上這事丘跌∠埃” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵闭树,是天一觀的道長耸棒。 經(jīng)常有香客問我,道長报辱,這世上最難降的妖魔是什么与殃? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮碍现,結(jié)果婚禮上幅疼,老公的妹妹穿的比我還像新娘。我一直安慰自己昼接,他們只是感情好爽篷,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著慢睡,像睡著了一般逐工。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上漂辐,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天泪喊,我揣著相機與錄音,去河邊找鬼髓涯。 笑死袒啼,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的复凳。 我是一名探鬼主播瘤泪,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼灶泵,長吁一口氣:“原來是場噩夢啊……” “哼育八!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起赦邻,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤髓棋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體按声,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡膳犹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了签则。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片须床。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖渐裂,靈堂內(nèi)的尸體忽然破棺而出豺旬,到底是詐尸還是另有隱情,我是刑警寧澤柒凉,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布族阅,位于F島的核電站,受9級特大地震影響膝捞,放射性物質(zhì)發(fā)生泄漏坦刀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一蔬咬、第九天 我趴在偏房一處隱蔽的房頂上張望鲤遥。 院中可真熱鬧,春花似錦林艘、人聲如沸渴频。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卜朗。三九已至,卻和暖如春咕村,著一層夾襖步出監(jiān)牢的瞬間场钉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工懈涛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留逛万,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓批钠,卻偏偏與公主長得像宇植,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子埋心,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355