首先安裝好 MongoDB 數(shù)據(jù)庫(kù)并啟動(dòng)它,然后進(jìn)入用 CMD 命令進(jìn)入到 ${MONGODB_HOME}/bin 目錄執(zhí)行 mongo 打開 MongoDB 客戶端。
連接 MongoDB、數(shù)據(jù)庫(kù)操作、集合操作
連接 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ù)庫(kù)版本
db.version()
查看當(dāng)前數(shù)據(jù)庫(kù)狀態(tài)
db.stats()
查看所有數(shù)據(jù)庫(kù)
show dbs
查看所有集合
show tables或show collections
查看當(dāng)前所在數(shù)據(jù)庫(kù)
db
使用數(shù)據(jù)庫(kù)
use dbName
刪除當(dāng)前正在使用的數(shù)據(jù)庫(kù)
db.dropDatabase()
創(chuàng)建集合
db.createCollection("collectionName")
刪除集合
db.collectionName.drop()
MongoDB 備份、恢復(fù)數(shù)據(jù)庫(kù)
導(dǎo)出
mongodump -h ip:port -d dbName -u username -p password -o dumpDir
-h:MongDB 所在服務(wù)器地址(如:127.0.0.1),也可以指定端口號(hào)(如:127.0.0.1:27017)-d:需要備份的數(shù)據(jù)庫(kù)實(shí)例(如:test)-o:備份的數(shù)據(jù)存放位置(如:D:\data\dump),該目錄需提前建立,備份完成后會(huì)在 D:\data\dump 目錄下建立一個(gè) test 目錄用于存放該數(shù)據(jù)庫(kù)實(shí)例的備份數(shù)據(jù)。
導(dǎo)入
mongorestore -h ip:port -d dbName dumpDir
--host ip:port、-h ip:port:MongoDB所在服務(wù)器地址(默認(rèn)是 localhost:27017)--db、-d:需要恢復(fù)的數(shù)據(jù)庫(kù)實(shí)例,例如:test,當(dāng)然這個(gè)名稱也可以和備份時(shí)候的不一樣,比如test2--drop:恢復(fù)時(shí)先刪除當(dāng)前數(shù)據(jù),然后恢復(fù)備份的數(shù)據(jù)。即:恢復(fù)后,備份操作之后添加、修改的數(shù)據(jù)都會(huì)被刪除!dumpDir:mongorestore 最后的一個(gè)參數(shù),設(shè)置備份數(shù)據(jù)所在位置(如:D:\data\dump\test)。注意:不能同時(shí)指定 dumpDir 和 --dir 選項(xiàng)。--dir:指定備份的目錄。注意:不能同時(shí)指定 dumpDir 和 --dir 選項(xiàng)。
MongoDB 插入文檔
MongoDB 使用 insert() 或 save() 方法向集合中插入文檔,語(yǔ)法如下:
db.collectionName.insert(document)
例如:
db.mycol.insert({title : 'MongoDB 教程',? ? description : 'MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)',? ? by : 'php中文網(wǎng)',? ? website : 'http://www.php.cn',? ? tags : ['mongodb', 'database', 'NoSQL'],? ? likes : 100});
也可以將數(shù)據(jù)定義為一個(gè)變量:
document=({title : 'MongoDB 教程',? ? description : 'MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)',? ? 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 字段,則會(huì)更新該 _id 的數(shù)據(jù)。
db.mycol.save({_id : ObjectId("5ede4968cfd2ea1834cc87c7"),title : 'MongoDB 教程(修改)',? ? description : 'MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)(修改)',? ? by : 'php中文網(wǎng)(修改)',? ? website : 'http://www.php.cn',? ? tags : ['mongodb(修改)', 'database(修改)', 'NoSQL(修改)'],? ? likes : 100});
MongoDB 3.2 版本后還有以下幾種語(yǔ)法可用于插入文檔:
db.collectionName.insertOne(document):向指定集合中插入一個(gè)文檔db.collectionName.insertMany(document):向指定集合中插入多個(gè)文檔
例1:插入一個(gè)文檔
var document = db.mycol.insertOne({"a": 3})
例2:插入多個(gè)文檔
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() 方法來更新集合中的文檔。接下來讓我們?cè)敿?xì)來看下兩個(gè)函數(shù)的應(yīng)用及其區(qū)別。1、update() 方法用于更新已存在的文檔。語(yǔ)法格式如下:
db.collectionName.update(? <query>,? <update>,? {? ? upsert : <boolean>,? ? multi : <boolean>,? ? writeConcern : <document>? })
參數(shù)說明:
query:查詢條件,類似于關(guān)系型數(shù)據(jù)庫(kù)查詢語(yǔ)句中的 where 條件。
update:更新的操作符或?qū)ο?,類似于關(guān)系型數(shù)據(jù)庫(kù)修改語(yǔ)句中的 set。
upsert:可選參數(shù)。當(dāng)不存在符合 query 查詢條件的記錄時(shí)是否插入,true 為插入,默認(rèn)是 false。
multi:可選參數(shù)。是否更新符合 query 查詢條件的所有記錄。參數(shù)為 true 時(shí)則就把按條件查出來的多條記錄全部更新。默認(rèn)是 false,即只更新找到的第一條記錄。
writeConcern:可選參數(shù),指定拋出異常的級(jí)別。有以下幾種異常級(jí)別。WriteConcern.NONE:沒有異常拋出。WriteConcern.NORMAL:僅拋出網(wǎng)絡(luò)錯(cuò)誤異常,沒有服務(wù)器錯(cuò)誤異常。WriteConcern.SAFE:拋出網(wǎng)絡(luò)錯(cuò)誤異常、服務(wù)器錯(cuò)誤異常;并等待服務(wù)器完成寫操作。WriteConcern.MAJORITY:拋出網(wǎng)絡(luò)錯(cuò)誤異常、服務(wù)器錯(cuò)誤異常;并等待一個(gè)主服務(wù)器完成寫操作。WriteConcern.FSYNC_SAFE:拋出網(wǎng)絡(luò)錯(cuò)誤異常、服務(wù)器錯(cuò)誤異常;寫操作等待服務(wù)器將數(shù)據(jù)刷新到磁盤。WriteConcern.JOURNAL_SAFE:拋出網(wǎng)絡(luò)錯(cuò)誤異常、服務(wù)器錯(cuò)誤異常;寫操作等待服務(wù)器提交到磁盤的日志文件。WriteConcern.REPLICAS_SAFE:拋出網(wǎng)絡(luò)錯(cuò)誤異常、服務(wù)器錯(cuò)誤異常;等待至少2臺(tái)服務(wù)器完成寫操作。
例如:通過 update() 方法來更新標(biāo)題(title)
db.mycol.update({'title' : 'MongoDB 教程'}, {$set : {'title' : 'MongoDB'}})
以上語(yǔ)句只會(huì)修改第一條發(fā)現(xiàn)的文檔,如果要修改多個(gè)文檔,則需要設(shè)置 multi 參數(shù)為 true,如下:
db.mycol.update({'title' : 'MongoDB 教程'}, {$set : {'title' : 'MongoDB'}}, {multi : true})
2、save() 方法通過傳入的文檔來替換已有文檔。語(yǔ)法格式如下:
db.collectionName.save(? <document>,? {? ? writeConcern: <document>? })
參數(shù)說明:
document:文檔數(shù)據(jù)。
writeConcern:可選參數(shù),指定拋出異常的級(jí)別。
下例替換 _id 為 56064f89ade2f21f36b03136 的文檔數(shù)據(jù):
db.mycol.save({"_id" : ObjectId("56064f89ade2f21f36b03136"),? ? "title" : "MongoDB",? ? "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)",? ? "by" : "php",? ? "website" : "http://www.php.cn",? ? "tags" : ["mongodb", "NoSQL"],? ? "likes" : 110})
3、使用的 $set 或 $unset 操作符來新增或移除集合中的鍵值對(duì)$set 或 $unset 操作符的語(yǔ)法格式如下:
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 操作符會(huì)將指定的值賦給指定的字段,若要更新的文檔存在,$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 版本后還有以下幾種語(yǔ)法可用于插入文檔:
db.collectionName.updateOne(document):更新指定集合中的單個(gè)文檔db.collectionName.updateMany(document):更新指定集合中的多個(gè)文檔
例1:更新單個(gè)文檔
db.mycol.updateOne({"title" : "abc"}, {$set : {"likes" : "100"}})
例2、更新多個(gè)文檔
db.mycol.updateMany({"likes" : {$gt : "10"}}, {$set : {"title" : "xyz"}})
MongoDB 刪除文檔
remove() 方法的基本語(yǔ)法格式如下:
db.collectionName.remove(? <query>,? <justOne>)
如果 MongoDB 是 2.6 版本以后的,語(yǔ)法格式如下:
db.collectionName.remove(? <query>,? {? ? justOne: <boolean>,? ? writeConcern: <document>? })
參數(shù)說明:
query:可選參數(shù)。刪除的文檔的條件。
justOne:可選參數(shù)。如果設(shè)為 true 或 1,則只刪除一個(gè)文檔。默認(rèn)值是 false。
writeConcern:可選參數(shù)。指定拋出異常的級(jí)別。
remove() 方法 并不會(huì)真正釋放空間,需要繼續(xù)執(zhí)行 db.repairDatabase() 來回收磁盤空間。
db.repairDatabase() 或 db.runCommand({ repairDatabase: 1 })
remove() 方法已經(jīng)過時(shí)了,現(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ù)庫(kù)中的 truncate 命令):
db.mycol.remove({})
如刪除集合中的全部文檔:
db.mycol.deleteMany({})
刪除 status 等于 ON 的全部文檔:
db.mycol.deleteMany({"status" : "ON"})
刪除 status 等于 ON 的一個(gè)文檔:
db.mycol.deleteOne({"status" : "D"})
MongoDB 查詢文檔
MongoDB 查詢文檔使用 find() 方法,該方法以非結(jié)構(gòu)化的方式來顯示所有文檔。MongoDB 查詢數(shù)據(jù)的語(yǔ)法格式如下:
db.collectionName.find(query, projection)
還可以使用 pretty() 方法以易讀的方式來讀取數(shù)據(jù),語(yǔ)法格式如下:
db.collectionName.find(query, projection).pretty()
參數(shù)說明:
query:可選參數(shù)。使用查詢操作符指定的查詢條件。
projection:可選參數(shù)。使用投影操作符指定返回的鍵。查詢時(shí)若需返回文檔中所有鍵值,則省略該參數(shù)即可(默認(rèn)省略)。projection 的入?yún)⒏袷綖閧"columnA" : 0/1, "columnB" : 0/1},其中 columnA、columnB 表示要查詢的集合中的字段,0/1 表示取或不取。
注:若不指定 projection,則默認(rèn)返回所有鍵;指定 projection 時(shí)有兩種模式,如下:
db.collectionName.find(query, {"title" : 1, "by" : 1}) // inclusion模式 指定返回的鍵,不返回其他鍵db.collectionName.find(query, {"title" : 0, "by" : 0}) // exclusion模式 指定不返回的鍵,返回其他鍵
_id 鍵默認(rèn)返回,需要主動(dòng)指定 _id:0 才會(huì)隱藏。兩種模式不可混用(因?yàn)檫@樣的話無法推斷其他鍵是否應(yīng)返回)。如下:
db.collection.find(query, {"title" : 1, "by" : 0}) // 錯(cuò)誤
只能 全1 或 全0,除了在 inclusion 模式時(shí)可以指定 _id:0
db.collection.find(query, {"_id" : 0, "title" : 1, "by" : 1}) // 正確
除 find() 方法外,還有一個(gè) findOne() 方法,它只返回一個(gè)文檔。
示例:
查詢集合中的所有文檔
db.mycol.find().pretty();
查詢集合中的所有文檔,只顯示 _id 和 title 列
db.mycol.find().pretty({}, {'title' : 1});
查詢集合中的所有文檔,只顯示 title 列
db.mycol.find().pretty({}, {'_id' : 0, 'title' : 1});
MongoDB 條件語(yǔ)句查詢:
等于:{<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() 方法可以傳入多個(gè)鍵(key),多個(gè)鍵(key)之間用逗號(hào)隔開,即常規(guī) SQL 的 AND 條件。語(yǔ)法格式如下:
db.collectionName.find({key1 : value1, key2 : value2}).pretty()
下例通過 by 和 title 來查詢 MongoDB 中 MongoDB 教程的文檔:
db.mycol.find({"by" : "MongoDB", "title" : "MongoDB 教程"}).pretty()
以上實(shí)例類似于 RDBMS 中的 WHERE 語(yǔ)句:WHERE by='菜鳥教程' AND title='MongoDB 教程'
MongoDB 中的 OR 條件:該類型的條件語(yǔ)句需要使用關(guān)鍵字 $or,語(yǔ)法格式如下:
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 語(yǔ)句:WHERE likes > 50 AND (by = 'MongoDB' OR title = 'MongoDB 教程')
MongoDB 條件操作符
條件操作符用于比較兩個(gè)表達(dá)式并從 MongoDB 集合中獲取數(shù)據(jù)。MongoDB中條件操作符有:
大于(>):$gt
大于等于(>=):$gte
小于(<):$lt
小于等于(<=):$lte
MongoDB? 大于(>)操作符:$gt獲取 mycol 集合中 likes 大于 100 的數(shù)據(jù):
db.mycol.find({"likes" : {$gt : 100}}).pretty(),類似于 SQL 語(yǔ)句:Select * from mycol where likes > 100;
MongoDB 大于等于(>=)操作符:$gte獲取 mycol 集合中 likes 大于等于 100 的數(shù)據(jù):
db.mycol.find({"likes" : {$gte : 100}}).pretty(),類似于 SQL 語(yǔ)句:Select * from mycol where likes >= 100;
MongoDB? 小于(<)操作符:$lt獲取 mycol 集合中 likes 小于 150 的數(shù)據(jù):
db.mycol.find({"likes" : {$lt : 150}}).pretty(),類似于SQL語(yǔ)句:Select * from mycol where likes < 150;
MongoDB 小于等于(<=)操作符:$lte獲取 mycol 集合中 likes 小于等于 150 的數(shù)據(jù):
db.mycol.find({"likes" : {$lte : 150}}).pretty(),類似于SQL語(yǔ)句: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語(yǔ)句: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() 方法接受一個(gè)數(shù)字參數(shù),該參數(shù)指定要從 MongoDB 中讀取的文檔個(gè)數(shù)。limit() 方法語(yǔ)法格式如下:
db.collectionName.find().limit(number)
下例查詢文檔中的2條記錄:
db.mycol.find({}, {"title" : 1, "_id" : 0}).limit(2)
注:如果沒有指定 limit() 方法中的參數(shù),則顯示集合中的所有文檔。
MongoDB Skip() 方法
除了可以使用 limit() 方法來讀取指定數(shù)量的文檔外,還可以用 skip() 方法來跳過指定數(shù)量的文檔,skip()方法也接受一個(gè)數(shù)字參數(shù)作為跳過的文檔個(gè)數(shù)。skip() 方法語(yǔ)法格式如下:
db.collectionName.find().limit(number).skip(number)
下例只會(huì)顯示第二條文檔數(shù)據(jù):
db.mycol.find({}, {"title" : 1, "_id" : 0}).limit(1).skip(1)
注:skip() 方法默認(rèn)參數(shù)為0。
MongoDB 排序
在 MongoDB 中使用 sort() 方法對(duì)文檔排序,該方法可以通過參數(shù)指定排序的字段,并使用 1(升序) 和 -1(降序) 來指定排序的方式。sort() 方法語(yǔ)法格式如下:
db.collectionName.find().sort({KEY : 1})
下例將 mycol 集合中的文檔按字段 likes 的降序排列:
db.mycol.find({}, {"title" : 1, "_id" : 0}).sort({"likes" : -1})
注:skip()、limilt()、sort() 三個(gè)一起執(zhí)行時(shí),執(zhí)行的先后順序是 sort()、skip()、limit()。
MongoDB 索引
索引通常能夠極大的提高查詢效率,如果沒有索引,MongoDB 在讀取數(shù)據(jù)時(shí)就會(huì)掃描集合中的所有文檔并選擇那些符合查詢條件的記錄。這種掃描全集合的查詢效率是非常低的,特別在處理大量數(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)。MongoDB 中創(chuàng)建索引的語(yǔ)法格式如下:
db.collectionName.ensureIndex(keys, options) // 3.0.0 版本前db.collectionName.createIndex(keys, options) // 3.0.0 版本后
Keys 為要?jiǎng)?chuàng)建的索引字段,1 指按升序創(chuàng)建索引,-1 指按降序創(chuàng)建索引。例如:
db.mycol.createIndex({"title" : 1})
也可以設(shè)置多個(gè)字段創(chuàng)建索引(即:RDBMS 中的復(fù)合索引)
db.mycol.createIndex({"title" : 1, "description" : -1})
options 為可選參數(shù),可取值為:
background:Boolean 類型,默認(rèn)值為 false。創(chuàng)建索引的過程會(huì)阻塞其它數(shù)據(jù)庫(kù)操作,background 可指定以后臺(tái)方式創(chuàng)建索引。
unique:Boolean 類型,默認(rèn)值為 false。建立的索引是否唯一。
name:String 類型。指定索引的名稱。如果未指定,MongoDB 通過連接索引的字段名和排序順序生成一個(gè)索引名稱。
dropDups:Boolean 類型,默認(rèn)值為 false。3.0+ 版本已廢棄。在建立唯一索引時(shí)是否刪除重復(fù)記錄。
sparse:Boolean 類型,默認(rèn)值為 false。對(duì)文檔中不存在的字段數(shù)據(jù)不啟用索引。如果設(shè)置為 true,則在索引字段中不會(huì)查詢出不包含對(duì)應(yīng)字段的文檔。
expireAfterSeconds:Integer類型。指定集合的生存時(shí)間,單位為秒。
v:索引的版本號(hào)。默認(rèn)的索引版本取決于 MongoDB 創(chuàng)建索引時(shí)運(yùn)行的版本。
weights:索引權(quán)重值,數(shù)值在 1 到 99,999 之間,表示該索引相對(duì)于其他索引字段的得分權(quán)重。
default_language:String 類型,默認(rèn)為英語(yǔ)。對(duì)于文本索引,該參數(shù)決定了停用詞及詞干和詞器的規(guī)則的列表。
language_override:String 類型,默認(rèn)值為 language。對(duì)于文本索引,該參數(shù)指定了包含在文檔中的字段名,語(yǔ)言覆蓋默認(rèn)的 language。
在創(chuàng)建索引時(shí)加 background:true 選項(xiàng),讓創(chuàng)建工作在后臺(tái)執(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 對(duì)存儲(chǔ)的數(shù)據(jù)進(jìn)行失效時(shí)間設(shè)置:經(jīng)過指定的時(shí)間段后或在指定的時(shí)間點(diǎn)過期,MongoDB 獨(dú)立線程去清除數(shù)據(jù)。類似于設(shè)置定時(shí)自動(dòng)刪除任務(wù),可以清除歷史記錄或日志等前提條件,設(shè)置 Index 的關(guān)鍵字段為日期類型 new Date()。
例、數(shù)據(jù)記錄中 createDate 為日期類型,設(shè)置在創(chuàng)建記錄 180 秒后刪除。:
db.mycol.createIndex({"createDate" : 1}, {expireAfterSeconds : 180})
例、由記錄中設(shè)定日期點(diǎn)清除。如設(shè)置某記錄在2020年6月13日12點(diǎn)左右刪除,則該記錄中需添加 "ClearUpDate": new Date('Jun 13, 2020 12:00:00'),且 Index中expireAfterSeconds 的值設(shè)置為 0。
db.mycol.createIndex({"ClearUpDate" : 1}, {expireAfterSeconds : 0})
MongoDB 設(shè)置 TTL 時(shí)注意事項(xiàng)
索引關(guān)鍵字段必須是 Date 類型。
刪除操作是非立即執(zhí)行的。MongoDB 中掃描集合過期數(shù)據(jù)并刪除是獨(dú)立線程執(zhí)行,默認(rèn) 60s 掃描一次,刪除也不一定是立即刪除成功。
單字段索引,混合索引不支持。
MongoDB 聚合
MongoDB 中的聚合(aggregate)主要用于處理數(shù)據(jù)(如:統(tǒng)計(jì)平均值、求和等),并返回計(jì)算后的結(jié)果。類似 sql 語(yǔ)句中的 count(*)。MongoDB 中聚合的方法使用 aggregate(),其語(yǔ)法格式如下:
db.collectionName.aggregate(AGGREGATE_OPERATION)
例、統(tǒng)計(jì)每個(gè)作者所寫的文章數(shù):
db.mycol.aggregate([{$group : {"_id" : "$by", "num" : {$sum : 1}}}])類似于:select by as _id, count(*) as num from mycol group by by
一些常用聚合表達(dá)式
$sum:計(jì)算總和。
db.mycol.aggregate([{$group : {"_id" : "$by", "num" : {$sum : "$likes"}}}])
$avg:計(jì)算平均值。
db.mycol.aggregate([{$group : {"_id" : "$by", "num" : {$avg : "$likes"}}}])
$min:獲取集合中所有文檔對(duì)應(yīng)值得最小值。
db.mycol.aggregate([{$group : {"_id" : "$by", "num" : {$min : "$likes"}}}])
$max:獲取集合中所有文檔對(duì)應(yīng)值得最大值。
db.mycol.aggregate([{$group : {"_id" : "$by", "num" : {$max : "$likes"}}}])
$push:在結(jié)果文檔中插入值到一個(gè)數(shù)組中。
db.mycol.aggregate([{$group : {"_id" : "$by", "website" : {$push: "$website"}}}])
$addToSet:在結(jié)果文檔中插入值到一個(gè)數(shù)組中,但不創(chuàng)建副本。
db.mycol.aggregate([{$group : {"_id" : "$by", "website" : {$addToSet : "$website"}}}])
$first:根據(jù)資源文檔的排序獲取第一個(gè)文檔數(shù)據(jù)。
db.mycol.aggregate([{$group : {"_id" : "$by", "first_website" : {$first : "$website"}}}])
$last:根據(jù)資源文檔的排序獲取最后一個(gè)文檔數(shù)據(jù)。
db.mycol.aggregate([{$group : {"_id" : "$by", "last_website" : {$last : "$website"}}}])
MongoDB 管道
管道在 Unix 和 Linux 中一般用于將當(dāng)前命令的輸出結(jié)果作為下一個(gè)命令的參數(shù)。MongoDB 的聚合管道將 MongoDB 文檔在一個(gè)管道處理完畢后將結(jié)果傳遞給下一個(gè)管道處理。管道操作是可以重復(fù)的。表達(dá)式:處理輸入文檔并輸出。表達(dá)式是無狀態(tài)的,只能用于計(jì)算當(dāng)前聚合管道的文檔,不能處理其它的文檔。
常用的幾個(gè)管道操作
$project:修改輸入文檔的結(jié)構(gòu)。可以用來重命名、增加或刪除域,也可以用于創(chuàng)建計(jì)算結(jié)果以及嵌套文檔。
$match:用于過濾數(shù)據(jù),只輸出符合條件的文檔。$match 使用 MongoDB 的標(biāo)準(zhǔn)查詢操作。
$limit:用來限制 MongoDB 聚合管道返回的文檔數(shù)。
$skip:在聚合管道中跳過指定數(shù)量的文檔,并返回余下的文檔。
$unwind:將文檔中的某一個(gè)數(shù)組類型字段拆分成多條,每條包含數(shù)組中的一個(gè)值。
$group:將集合中的文檔分組,可用于統(tǒng)計(jì)結(jié)果。
$sort:將輸入文檔排序后輸出。
$geoNear:輸出接近某一地理位置的有序文檔。
管道操作符實(shí)例
$project 實(shí)例
db.mycol.aggregate({$project : {"title" : 1, "description" : 1}})
上例結(jié)果中就只有 _id、tilte、description 三個(gè)字段了(默認(rèn)包含 _id 字段),如果不想要 _id 字段則可以這樣寫:
db.mycol.aggregate({$project : {"_id" : 0, "title" : 1, "description" : 1}})
$match 實(shí)例
db.mycol.aggregate([{$match : {"likes" : {$gt : 10, $lte : 100}}},{$group : {"_id": null, "count": {$sum: 1}}}]);
$match 用于獲取 likes 大于10且小于等于100的記錄,然后將符合條件的記錄送到 $group 管道操作符進(jìn)行處理。注意:當(dāng) $match 和 $group 同時(shí)存在時(shí),順序會(huì)影響檢索結(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 實(shí)例
db.mycol.aggregate({$skip : 2});
經(jīng)過 $skip 管道操作符處理后,前2個(gè)文檔就被"過濾"掉了。
** 按日、按月、按年、按周、按小時(shí)、按分鐘等聚合操作**
db.mycol.aggregate([{$match : {"by" : "runoob", pubDate : {$gt : new Date(2020, 2, 2)}}},{$group : {"id" : {$dayOfMonth : '$pubDate'}, "page_view" : {$sum : 1}}},{$sort : {"id" : 1}}])
時(shí)間關(guān)鍵字如下:
$dayOfYear: 返回該日期是這一年的第幾天(全年 366 天)。
$dayOfMonth: 返回該日期是這一個(gè)月的第幾天(1~31)。
$dayOfWeek: 返回的是這個(gè)周的星期幾(1~7:1-星期日、7-星期六)。
$year: 返回該日期的年份部分。
$month: 返回該日期的月份部分(1~12)。
$week: 返回該日期是所在年的第幾個(gè)星期(0~53)。
$hour: 返回該日期的小時(shí)部分。
$minute: 返回該日期的分鐘部分。
$second: 返回該日期的秒部分(以0~59之間的數(shù)字形式返回日期的第二部分,但可以是60來計(jì)算閏秒)。
$millisecond:返回該日期的毫秒部分(0~999)。
$dateToString: 格式化日期時(shí)間成字符串。如:
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/