【基礎(chǔ)】
安裝:
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.0.7.tgz
tar zxvf mongodb-linux-x86_64-rhel70-3.0.7.tgz
mv mongodb-linux-x86_64-rhel70-3.0.7.tgz mongodb
rsync -a mongodb /usr/local # 復(fù)制到/usr/lcoal下
mkdir /usr/local/mongodb/data # 數(shù)據(jù)目錄
touch /usr/local/mongodb/dblogs # 日志文件
./usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data --logpath=/usr/local/mongodb/dblogs --fork # 啟動(dòng)
pstree -p | grep mongod
啟動(dòng)命令常用參數(shù)選項(xiàng)說明:
--dbpath 指定數(shù)據(jù)庫的目錄
--port 指定數(shù)據(jù)庫的端口,默認(rèn)是27017
--bind_ip 綁定IP
--logpath 指定日志存放目錄
--logappend 指定日志生成方式(追加/覆蓋)
--pidfilepath 指定進(jìn)程文件路徑锈颗,如果不指定差油,將不產(chǎn)生進(jìn)程文件
--keyFile 集群模式授權(quán)驗(yàn)證的私有key
--journal 啟用日志
--nssize 指定.ns文件的大小烁登,單位MB较幌,默認(rèn)是16M集嵌,最大是2G
--maxConns 最大的并非連接數(shù)
--notablescan 不允許進(jìn)行表掃描
--noprealloc 關(guān)閉數(shù)據(jù)文件的預(yù)分配功能
--fork 以后臺(tái)Daemon形式運(yùn)行服務(wù)
更多的參數(shù)選項(xiàng)利用mongod --help 進(jìn)行查看
啟動(dòng)時(shí)會(huì)顯示或在日志里的4個(gè)Warning:
** WARNING: Readahead for /usr/local/mongodb is set to 4096KB
We suggest setting it to 256KB (512 sectors) or less
http://dochub.mongodb.org/core/readahead
** WARNING: You are running this process as the root user, which is not recommended.
** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
We suggest setting it to 'never'
** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
We suggest setting it to 'never'
① 參考官網(wǎng)提示:
保證對(duì)用來存儲(chǔ)數(shù)據(jù)文件的塊設(shè)備的預(yù)讀設(shè)置是合適的。對(duì)于隨機(jī)訪問模式蹂窖,設(shè)置低的預(yù)讀值。一個(gè)預(yù)讀值為32(16kb)通常工作的很好恩敌。
對(duì)于標(biāo)準(zhǔn)塊設(shè)備瞬测,可以運(yùn)行 sudo blockdev --report 得到預(yù)讀值設(shè)置,運(yùn)行 sudo blockdev --setra <value> <value> 改變預(yù)讀值設(shè)置纠炮。
參考你的具體操作系統(tǒng)手冊(cè)來了解更多信息月趟。
其實(shí)運(yùn)行了 blockdev --report 之后展示了幾行信息,排除非4096的恢口,但這樣是不能確定哪個(gè)是用來存儲(chǔ)數(shù)據(jù)文件的塊設(shè)備孝宗。
用 df -h 查看文件系統(tǒng)信息,可以看到容量最大的就是我們的硬盤耕肩,就用它來存儲(chǔ)數(shù)據(jù)文件吧因妇。
運(yùn)行 blockdev --setra 256 你的盤符名(如:/dev/sda2)。
② 第二個(gè)完全可以忽略猿诸。
③④ 按照建議設(shè)置婚被,設(shè)置方式參考:
https://docs.mongodb.org/manual/tutorial/transparent-huge-pages/
https://oracle-base.com/articles/linux/configuring-huge-pages-for-oracle-on-linux-64#disabling-transparent-hugepages
我這里就直接把下面的加到rc.local的末尾,開機(jī)設(shè)置并自啟:
# {{{ 去除Mongodb啟動(dòng)時(shí)Warning
if [ -f /sys/kernel/mm/transparent_hugepage/enabled ]; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if [ -f /sys/kernel/mm/transparent_hugepage/defrag ]; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
blockdev --setra 256 /dev/sda2
# }}}
/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data --logpath=/usr/local/mongodb/dblogs --fork
如果當(dāng)前手工改動(dòng)后两芳,驗(yàn)證是否由 [always] madvise never 變?yōu)?always madvise [never]
cat /sys/kernel/mm/transparent_hugepage/enabled
- 進(jìn)入客戶端:
/usr/local/mongodb/bin/mongo摔寨,進(jìn)入后默認(rèn)創(chuàng)建并選擇test數(shù)據(jù)庫。
與關(guān)系型數(shù)據(jù)庫的對(duì)應(yīng)關(guān)系:
| MySQL | MongoDB|
| ------------- |:-------------:||
| database(數(shù)據(jù)庫) |database(數(shù)據(jù)庫) |
| table(表) | collection(集合) |
| rows(記錄) | document(文檔對(duì)象) |
基礎(chǔ)命令:
db 顯示當(dāng)前所在數(shù)據(jù)庫
use test 選擇test數(shù)據(jù)庫怖辆,默認(rèn)就在test庫
show dbs 顯示所有數(shù)據(jù)庫
show collections 顯示當(dāng)前數(shù)據(jù)庫的表
show tables ∈歉础(上面的別名)
db.ci.insert({name:'far', age:'18'}) 在test庫的ci集合中插入一條數(shù)據(jù)
db.ci.find(); 查詢ci集合所有數(shù)據(jù)
db.ci.find({條件}); 查詢指定數(shù)據(jù)
db.ci.remove({name:"user1"}) 刪除test數(shù)據(jù)庫ci集合中的數(shù)據(jù)
db.ci.remove({}) 刪除所有數(shù)據(jù)
db.ci.update({name:'far'}, {name:'fff'}); 修改查找到的數(shù)據(jù),會(huì)將數(shù)據(jù)的其它字段清除
db.ci.update({name:'fff'}, {$set:{name:'wish'}}); 只修改當(dāng)前查找到的字段竖螃,其余不變
條件表達(dá)式($gt, $gte, $lt, $lte, $ne, $in, $nin, $all, $mod, $exists, $or, $nor, $size, $elemMatch):
db.ci.find({age: {$gt: 5}}) 大于5的
db.ci.find({age: {$gte: 5}}) 大于等于5的
db.ci.find({age: {$lt: 5}}) 小于5的
db.ci.find({age: {$lte: 5}}) 小于等于5的
db.ci.find({age: 5}) 等于5的
db.ci.find({age: {$ne: 5}}) 不等于5的
db.ci.find({age: {$in: [1, 3, 5]}}) 在1,3,5中的淑廊,這里的中括號(hào)不是數(shù)組
db.ci.find({age: {$nin: [1, 3, 5]}}) 不在1, 3, 5中的
db.c2.insert({name: 'user1', post: [1,2,3,4,5]});
db.c2.find({post: {$all: [1,2,3]}}) 查詢post里面包含數(shù)組123的,有一個(gè)不包含則不顯示
取余($mod)
db.ci.find({age: {$mod: [2,1]}}) 這里的中括號(hào)是操作符特咆,除2余1的行
db.ci.find({age: {$mod: [3,1]}}) 除3余1的行
db.ci.find({age: {$mod: [4,0]}}) 除4余0的行
檢查一個(gè)字段是否存在($exists)
db.c2.find({ age: {$exists: 1}}) 查詢c2里面是否有包含age字段的數(shù)據(jù)季惩,有就返回此行
db.c2.find({name: {$exists: 1}})
db.c2.find({post: {$exists: 1}})
或者/除了($or/$nor),語法與其它的不一樣
db.ci.find({$or: [{name:'user1'}, {age:8}]}) name為user1 或者 age為8的行
db.ci.find({$nor: [{name:'user1'}, {age:8}]}) 除了 name為user1 和 age為8的行
根據(jù)數(shù)組長度篩選($size)
db.c2.find({post: {$size: 5}}) 查詢post數(shù)組長度為5的行
db.c2.find({post: {$size: 1}})
元素匹配($elemMathc)
db.c3.insert({name: 'user1', post: [{tit: 1}, {tit: 2}, {tit: 3}]})
db.c3.insert({name: 'user2', post: [{tit: 'aa'}, {tit: 'bb'}, {tit: 'cc'}]})
db.c3.find({'post.tit': 'aa'}) 支持字段間的點(diǎn)操作符
db.c3.find({post: {$elemMatch: {'tit': 'aa'}}}) 效果同上腻格,$elemMatch表示匹配post下面的元素画拾,這種用法可以避免上一種用法的點(diǎn)操作符在其它語言中可能引起的麻煩
正則:
db.c2.find({name:/ser1/i})
NULL查詢:
db.c4.insert({name:'user1'});
db.c4.insert({name:'user2', age:10})
db.c4.insert({name:'user3', age:11})
db.c4.insert({name:'user4', age:null})
db.c4.find({age: {$exists: 1, $in: [null]}}) 先過濾掉沒有age的,然后取null值的行
db.c4.find({age: {$type: 10}}) age類型為10的行菜职,同上青抛。(關(guān)于這個(gè)類型有很多種,每個(gè)都有對(duì)應(yīng)的數(shù)字表示)
db.c4.find({age: {$type: 10}, {name: 'user3'}}) 逗號(hào)隔開酬核,同時(shí)滿足兩個(gè)條件
$slice蜜另,取數(shù)組的一部分:
db.c3.find({name: 'user1'}, {post: {$slide: 2}}) 取post值的前兩條
db.c3.find({name: 'user1'}, {post: {$slide: -2}}) 取post值的后兩條
db.c3.find({name: 'user1'}, {post: {$slide: [2, 2]}}) 取post的值:跳過第2個(gè)取2個(gè)
數(shù)量适室,排序,限制:
db.ci.count() 統(tǒng)計(jì)數(shù)量举瑰,支持鏈?zhǔn)讲僮?db.ci.find().count()
db.ci.find().sort({name:1}) 升序排序
db.ci.find().sort({age:-1}) 降序排序
db.ci.find().skip(2).limit(3) 跳過2個(gè)顯示3個(gè)
db.ci.find().sort({age:-1}).skip(2).limit(3) 即使sort放在后面也會(huì)先排序
db.ci.find().sort({age:-1}).skip(2).limit(3).count(0) count不傳和傳0捣辆,不包含find()后面的條件
db.ci.find().sort({age:-1}).skip(2).limit(3).count(1) count傳1,包含find()后面的條件
Distinct此迅,類似Sql中的distinct:
db.ci.distinct('name') 返回不唯一的name的值組成的數(shù)組
游標(biāo)汽畴,類似Sql中的游標(biāo):
var x = db.ci.find()
x.hasNext() 只有在判斷是否有下一條的時(shí)候才連接數(shù)據(jù)庫
x.next() 取值
更新操作:
db.collection.update(criteria, objNew, upsert, multi)
criteria:用于設(shè)置查詢條件的對(duì)象
objNew:用于設(shè)置更新內(nèi)容的對(duì)象
upsert:如果記錄已經(jīng)存在,那么更新它邮屁,否則新增一條記錄(0或1整袁,默認(rèn)給0最合適)
multi:如果多個(gè)符合條件的記錄,全部更新佑吝;默認(rèn)情況下坐昙,只會(huì)更新第一個(gè)符合條件的記錄。(0或1芋忿,最好設(shè)為1全部跟新)
db.c4.update({name:'user4'}, {name:'user44'}, 1) 第三個(gè)參數(shù)設(shè)為1炸客,那么前面的不存在,就插入新的objNew數(shù)據(jù)戈钢;如果存在痹仙,第三個(gè)參數(shù)0和1無所謂
db.c5.insert({name:'user1'})
db.c5.insert({name:'user1'})
db.c5.insert({name:'user1'})
db.c5.update({name:'user1'}, {name:'user11'}) 不加第四個(gè)參數(shù),只更新第一條匹配的數(shù)據(jù)
db.c5.update({name:'user1'}, {name:'user11'}, 0, 1) 報(bào)錯(cuò)殉了,multi update only works with $ operators开仰,必須帶$set
db.c5.update({name:'user11'}, {$set: {name:'user1'}}, 0, 1) 全部更改的正確方式,使用模式方法$set
db.c5.update({name:'user1'}, {$set : {age:10}}, 0, 1) 當(dāng)要更改成的字段age不存在時(shí)薪铜,增加一個(gè)字段众弓,類似Sql的set操作
$inc自增操作:
db.c5.insert({name: 'user1', scrore: 10})
db.c5.update({name: 'user1'}, {$set: {score: 5}}, 0, 1) 給user1的積分加5,score字段有則累加隔箍,沒有則創(chuàng)建并累加谓娃;$set沒有辦法完成加減
db.c5.update({}, {$set: {score: 5}}, 0, 1) 給所有人積分加5
db.c5.update({name:'user1'}, {$inc: {score: -2}}, 0, 1)
$unset刪除字段:
db.c5.update({}, {$unset: {score: 1, age: 1}}, 0, 1) 這里的1是為真的意思
$push對(duì)數(shù)組值新增元素:
db.c5.insert({name:'user2', arr:[1, 2, 3]})
db.c5.update({name:'user2'}, {$push: {arr: 4}}) 在arr字段的數(shù)組中新加一個(gè)元素
db.c5.update({name:'user2'}, {$push: {arr: [5, 6, 7]}}) 在arr字段的數(shù)組中新加一個(gè)子數(shù)組
db.c5.udpate({name:'user2'}, {$pop: {arr: 1}}) 把a(bǔ)rr字段數(shù)組中最后一個(gè)元素彈出
db.c5.update({name:'user2'}, {$pushAll: {arr: [5, 6, 7]}}); 批量在arr字段的數(shù)組中新增元素,中括號(hào)是操作符蜒滩,依次壓入中括號(hào)里的三個(gè)數(shù)