go mongodb排序查询_《MongoDB》day two
語(yǔ)法格式:db.COLLECTION_NAME.update({查詢(xún)條件},{更新內(nèi)容},{更新參數(shù)(可選)})
注:這種方式會(huì)覆蓋原有的文檔。
db.集合名.update({key:“value”},{key:“value”})
$set:更新文檔(只更新指定鍵,不會(huì)覆蓋整個(gè)文檔),若該鍵不存在,會(huì)自動(dòng)創(chuàng)建,并插入數(shù)據(jù)
$unset:刪除指定鍵
$push:向文檔的某個(gè)數(shù)組類(lèi)型的鍵添加一個(gè)數(shù)組元素,不過(guò)濾重復(fù)的數(shù)據(jù)。添 加時(shí)鍵存在,要求鍵值類(lèi)型必須是數(shù)組;鍵不存在,則創(chuàng)建數(shù)組類(lèi)型的鍵
$inc:對(duì)文檔的某個(gè)值為數(shù)字型(只能為滿(mǎn)足要求的數(shù)字)的鍵進(jìn)行增減的操作。
$pop 操作符:刪除數(shù)據(jù)元素,給定值1表示從數(shù)組尾部刪除,-1表示從數(shù)組頭部刪除。
$pull 操作符:從數(shù)組中刪除滿(mǎn)足條件的元素
$pullAll 操作符:從數(shù)組中刪除滿(mǎn)足條件的多個(gè)元素
$rename 操作符:對(duì)鍵進(jìn)行重新命名。
save() 方法通過(guò)傳入的文檔來(lái)替換已有文檔。
語(yǔ)法格式:db.集合名.save({文檔})
使用 remove()函數(shù)可刪除集合中的指定文檔。
語(yǔ)法格式:remove({指定刪除條件},刪除參數(shù)(可選參數(shù)))
如果使用的條件在集合中可以匹配多條數(shù)據(jù),那么 remove()函數(shù)會(huì)刪除所有滿(mǎn)足條件的 數(shù)據(jù)。我們可以在 remove 函數(shù)中給定 justOne,表示只刪除第一條,在 remove 函數(shù)中給定
注意:remove() 方法 并不會(huì)真正釋放空間。需要繼續(xù)執(zhí)行 db.repairDatabase() 來(lái)回收 磁盤(pán)空間 參數(shù) 1 即可。
2. deleteOne()函數(shù)
deleteOne()函數(shù)是官方推薦刪除文檔的方法。該方法只刪除滿(mǎn)足條件的第一條文檔。
3.deleteMany()函數(shù)
deleteMany 函數(shù)是官方推薦的刪除方法。該方法刪除滿(mǎn)足條件的所有數(shù)據(jù)。 再次插入兩條測(cè)試數(shù)據(jù)
刪除集合中的所有文檔 1.remove({}) 、2.deleteMany({})
1 find()函數(shù)
在 MongoDB 中可以使用 find()函數(shù)查詢(xún)文檔。
語(yǔ)法格式為:find({查詢(xún)條件(可選)},{指定投影的鍵(可選)}) 如果未給定參數(shù)則表示查詢(xún)所有數(shù)據(jù)。
pretty()函數(shù)可以使用格式化的方式來(lái)顯示所有文檔。
2 findOne()函數(shù)
findOne()函數(shù)只返回滿(mǎn)足條件的第一條數(shù)據(jù)。如果未做投影操作該方法則自帶格式化功 能。
語(yǔ)法格式:findOne({查詢(xún)條件(可選)},{投影操作(可選)})
3 模糊查詢(xún)
在 MongoDB 中可以通過(guò)//與^ 、$實(shí)現(xiàn)模糊查詢(xún),注意使用模糊查詢(xún)時(shí)查詢(xún)條件不能放到 雙引號(hào)或單引號(hào)中。使用^表示起始位置,使用$表示結(jié)尾位置。
在 find 函數(shù)中我們可以指定投影鍵。
語(yǔ)法格式為:find({查詢(xún)條件},{投影鍵名:1(顯示該列)|0(不顯示該列),投影鍵名:1|0,......})
_id 列默認(rèn)為顯示列。如果不顯示_id 可在投影中通過(guò) 0 過(guò)濾
$gt:大于指定條件,用于數(shù)字或日期運(yùn)算
$lt:小于指定條件,用于數(shù)字或日期運(yùn)算
$gte:大于等于指定條件,用于數(shù)字或日期運(yùn)算
$lte:小于等于指定條件,用于數(shù)字或日期運(yùn)算
$eq:等于指定條件,用于數(shù)字或日期運(yùn)算
$ne:不等于指定條件,用于數(shù)字或日期運(yùn)算
$and:表示多條件間的并且關(guān)系
語(yǔ)法格式為:find({$and:[{條件一},{,條件二},.......]})
注意:這種方式只能當(dāng)參與判斷的條件key相同時(shí)使用
$or:表示多條件間的或者關(guān)系。
語(yǔ)法格式為:find({$or:[{條件一},{條件二},.....]})
8.1and和or如何聯(lián)合使用?
查詢(xún) title 為 test5 并且 size 等于 500,或者 size 小于 400 的文檔。
$type:根據(jù)value的類(lèi)型查詢(xún)
limit函數(shù):使用 MongoDB 的 Limit 函數(shù), limit()函數(shù)接受一個(gè)數(shù)字參數(shù),該參數(shù)指定從 MongoDB 中讀取的記錄條數(shù)。
語(yǔ)法格式:db.COLLECTION_NAME.find().limit(NUMBER)
skip函數(shù):使用 skip()函數(shù)來(lái)跳過(guò) 指定數(shù)量的數(shù)據(jù),skip 函數(shù)同樣接受一個(gè)數(shù)字參數(shù)作為跳過(guò)的記錄條數(shù)。
語(yǔ)法格式:db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
實(shí)現(xiàn)分頁(yè)顯示第五頁(yè)數(shù)據(jù),每頁(yè)五條:
db.dev.find({},{title:1,_id:0}).skip(25).limit(5)
注意:我們可以使用 skip 函數(shù)與 limit 函數(shù)實(shí)現(xiàn) MongoDB 的分頁(yè)查詢(xún),但是官方并不推薦這 樣做,因?yàn)闀?huì)掃描全部文檔然后在返回結(jié)果,效率過(guò)低。
在 MongoDB 中使用 sort() 函數(shù)對(duì)查詢(xún)到的文檔進(jìn)行排序,sort() 函數(shù)可以通過(guò)參數(shù) 指定排序的字段,并使用 1 和 -1 來(lái)指定排序的方式,其中 1 為升序排列,而 -1 是用于 降序排列。
語(yǔ)法格式:db.COLLECTION_NAME.find().sort({排序鍵:1})
在 MongoDB 中會(huì)自動(dòng)為文檔中的_Id(文檔的主鍵)鍵創(chuàng)建索引,與關(guān)系型數(shù)據(jù)的主鍵索 引類(lèi)似。 我們可以使用 createIndex()函數(shù)來(lái)為其他的鍵創(chuàng)建索引。在創(chuàng)建索引時(shí)需要指定排序規(guī) 則。1 按照升序規(guī)則創(chuàng)建索引,-1 按照降序規(guī)則創(chuàng)建索引。 在創(chuàng)建索引時(shí),需要使用具有 dbAdmin 或者 dbAdminAnyDatabase 角色的用戶(hù)。
語(yǔ)法格式:db.COLLECTION_NAME.createIndex({創(chuàng)建索引的鍵:排序規(guī)則,......},{創(chuàng)建索 引的參數(shù)(可選參數(shù))})
通過(guò) getIndexes()或者 getIndexSpecs()函數(shù)查看集合中的所有索引信息。
語(yǔ)法格式:db.COLLECTION_NAME.getIndexes()
語(yǔ)法格式:db.COLLECTION_NAME.getIndexSpecs()
使用db.集合名.getIndexKeys()查看集合中的索引鍵
查看索引大小:
我們可以通過(guò) totalIndexSize()函數(shù)來(lái)查看當(dāng)前集合中索引的大小,單位為字節(jié)。
語(yǔ)法格式:db.COLLECTION_NAME.totalIndexSize([detail](可選參數(shù))) 參數(shù)解釋:detail 可選參數(shù),傳入除 0 或 false 外的任意數(shù)據(jù),那么會(huì)顯示該集合中每個(gè) 索引的大小及集合中索引的總大小。如果傳入 0 或 false 則只顯示該集合中所有索引的總大 小。默認(rèn)值為 false。
1. 刪除集合中的指定索引
通過(guò) dropIndex()函數(shù)來(lái)刪除指定索引。
語(yǔ)法格式:db.COLLECTION_NAME.dropIndex("索引名稱(chēng)")。
2. 刪除集合中的全部索引
使用 dropIndexes()函數(shù)刪除集合中的全部索引,_id 鍵的索引除外。
語(yǔ)法格式:db.COLLECTION_NAME.dropIndexes()
注意:_id索引不會(huì)被刪除掉
3.重建索引
我可以使用 reIndex()函數(shù)重建索引。重建索引可以減少索引存儲(chǔ)空間,減少索引碎片, 優(yōu)化索引查詢(xún)效率。一般在數(shù)據(jù)大量變化后,會(huì)使用重建索引來(lái)提升索引性能。重建索引是 刪除原索引重新創(chuàng)建的過(guò)程,不建議反復(fù)使用。
語(yǔ)法格式:db.COLLECTION_NAME.reIndex()
1.單字段索引(Single Field Index)
所謂單字段索引是指在索引中只包含了一個(gè)鍵。查詢(xún)時(shí),可加速對(duì)該字段的各種查詢(xún)請(qǐng) 求,是最常見(jiàn)的索引形式。MongoDB 默認(rèn)創(chuàng)建的_Id 索引也是這種類(lèi)型。我們可以使用 createIndexes({索引鍵:排序規(guī)則})函數(shù)來(lái)創(chuàng)建單字段索引
語(yǔ)法格式:db.COLLECTION_NAME.createIndexes({索引鍵名:排序規(guī)則})
2 交叉索引
所謂交叉索引就是為一個(gè)集合的多個(gè)字段分別建立索引,在查詢(xún)的時(shí)候通過(guò)多個(gè)字段作 為查詢(xún)條件,這種情況稱(chēng)為交叉索引。 在查詢(xún)文檔時(shí),在查詢(xún)條件中包含一個(gè)交叉索引鍵或者在一次查詢(xún)中使用多個(gè)交叉索引 鍵作為查詢(xún)條件都會(huì)觸發(fā)交叉索引。
3 復(fù)合索引(Compound Index)
復(fù)合索引是 Single Field Index 的升級(jí)版本,它針對(duì)多個(gè)字段聯(lián)合創(chuàng)建索引,先按第一個(gè) 字段排序,第一個(gè)字段相同的文檔按第二個(gè)字段排序,依次類(lèi)推。 語(yǔ)法格式:db.COLLECTION_NAME.createIndex({索引鍵名:排序規(guī)則, 索引鍵名:排序規(guī) 則,......}); 復(fù)合索引能滿(mǎn)足的查詢(xún)場(chǎng)景比單字段索引更豐富,不光能滿(mǎn)足多個(gè)字段組合起來(lái)的查 詢(xún),也能滿(mǎn)足所以能匹配符合索引前綴的查詢(xún)。
4 多 key 索引 (Multikey Index)
當(dāng)索引的字段為數(shù)組時(shí),創(chuàng)建出的索引稱(chēng)為多 key 索引,多 key 索引會(huì)為數(shù)組的每個(gè)元 素建立一條索引。
語(yǔ)法格式:db.COLLECTION_NAME.createIndex({數(shù)組鍵名:排序規(guī)則});
5. 唯一索引 (unique index)
唯一索引會(huì)保證索引對(duì)應(yīng)的鍵不會(huì)出現(xiàn)相同的值,比如_id 索引就是唯一索引
語(yǔ)法格式:db.COLLECTION_NAME.createIndex({索引鍵名:排序規(guī)則},{unique:true}) 如果唯一索引所在字段有重復(fù)數(shù)據(jù)寫(xiě)入時(shí),拋出異常。
6.部分索引 (partial index):
部分索引是只針對(duì)符合某個(gè)特定條件的文檔建立索引,3.2 版本才支持該特性。 MongoDB 部分索引只為那些在一個(gè)集合中,滿(mǎn)足指定的篩選條件的文檔創(chuàng)建索引。由 于部分索引是一個(gè)集合文檔的一個(gè)子集,因此部分索引具有較低的存儲(chǔ)需求,并降低了索引 創(chuàng)建和維護(hù)的性能成本。部分索引通過(guò)指定過(guò)濾條件來(lái)創(chuàng)建,可以為 MongoDB 支持的所有 索引類(lèi)型使用部分索引。 簡(jiǎn)單點(diǎn)說(shuō):部分索引就是帶有過(guò)濾條件的索引,即索引只存在與某些文檔之上
語(yǔ) 法 格 式 : db.COLLECTION_NAME.createIndex({ 索引鍵名: 排 序 規(guī) 則},{partialFilterExpression:{鍵名:{匹配條件:條件值}}})
注意:部分索引只為集合中那些滿(mǎn)足指定的篩選條件的文檔創(chuàng)建索引。如果你指定的 partialFilterExpression 和唯一約束、那么唯一性約束只適用于滿(mǎn)足篩選條件的文檔。具有唯 一約束的部分索引不會(huì)阻止不符合唯一約束且不符合過(guò)濾條件的文檔的插入
1.建立合適的索引
為每一個(gè)常用查詢(xún)結(jié)構(gòu)建立合適的索引。 復(fù)合索引是創(chuàng)建的索引由多個(gè)字段組成,例如: db.test.createIndex({"username":1, "age":-1}) 交叉索引是每個(gè)字段單獨(dú)建立索引,但是在查詢(xún)的時(shí)候組合查找,例如: db.test.createIndex({"username":1}) db.test.createIndex({"age":-1}) db.test.find({"username":"kaka", "age": 30}) 交叉索引的查詢(xún)效率較低,在使用時(shí),當(dāng)查詢(xún)使用到多個(gè)字段的時(shí)候,盡量使用復(fù)合索 引,而不是交叉索引
2 復(fù)合索引的字段排列順序
當(dāng)我們的組合索引內(nèi)容包含匹配條件以及范圍條件的時(shí)候,比如包含用戶(hù)名(匹配條件)
以及年齡(范圍條件),那么匹配條件應(yīng)該放在范圍條件之前。
3.查詢(xún)時(shí)盡可能僅查詢(xún)出索引字段
有時(shí)候僅需要查詢(xún)少部分的字段內(nèi)容,而且這部分內(nèi)容剛好都建立了索引,那么盡可能 只查詢(xún)出這些索引內(nèi)容,需要用到的字段顯式聲明(_id 字段需要顯式忽略!)。因?yàn)檫@些 數(shù)據(jù)需要把原始數(shù)據(jù)文檔從磁盤(pán)讀入內(nèi)存,造成一定的損耗
4.對(duì)現(xiàn)有的數(shù)據(jù)大表建立索引的時(shí)候,采用后臺(tái)運(yùn)行方式
在對(duì)數(shù)據(jù)集合建立索引的過(guò)程中,數(shù)據(jù)庫(kù)會(huì)停止該集合的所有讀寫(xiě)操作,因此如果建立 索引的數(shù)據(jù)量大,建立過(guò)程慢的情況下,建議采用后臺(tái)運(yùn)行的方式,避免影響正常業(yè)務(wù)流程。
1.額外開(kāi)銷(xiāo)
每個(gè)索引占據(jù)一定的存儲(chǔ)空間,在進(jìn)行插入,更新和刪除操作時(shí)也需要對(duì)索引進(jìn)行操作。 所以,如果你很少對(duì)集合進(jìn)行讀取操作,建議不使用索引。
2 內(nèi)存使用
由于索引是存儲(chǔ)在內(nèi)存(RAM)中,你應(yīng)該確保該索引的大小不超過(guò)內(nèi)存的限制。 如果索引的大小大于內(nèi)存的限制,MongoDB 會(huì)刪除一些索引,這將導(dǎo)致性能下降。
3 查詢(xún)限制
索引不能被以下的查詢(xún)使用: 正則表達(dá)式(最左匹配除外)及非操作符,如 $nin, $not, 等。 算術(shù)運(yùn)算符,如 $mod, 等。 所以,檢測(cè)你的語(yǔ)句是否使用索引是一個(gè)好的習(xí)慣,可以用 explain 來(lái)查看。
4 最大范圍
集合中索引不能超過(guò) 64 個(gè) 索引名的長(zhǎng)度不能超過(guò) 128 個(gè)字符 一個(gè)復(fù)合索引最多可以有 31 個(gè)字段
總結(jié)
以上是生活随笔為你收集整理的go mongodb排序查询_《MongoDB》day two的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 利用哈希表实现电话号码查询系统
- 下一篇: 二进制转8421bcd码_绝对值编码器当