mongodb基礎(chǔ)

【基礎(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
  1. 進(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ù)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末滨达,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子俯艰,更是在濱河造成了極大的恐慌捡遍,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竹握,死亡現(xiàn)場(chǎng)離奇詭異稽莉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)涩搓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門污秆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人昧甘,你說我怎么就攤上這事良拼。” “怎么了充边?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵庸推,是天一觀的道長。 經(jīng)常有香客問我浇冰,道長贬媒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任肘习,我火速辦了婚禮际乘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘漂佩。我一直安慰自己脖含,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布投蝉。 她就那樣靜靜地躺著养葵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瘩缆。 梳的紋絲不亂的頭發(fā)上关拒,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音庸娱,去河邊找鬼着绊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛涌韩,可吹牛的內(nèi)容都是我干的畔柔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼臣樱,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼靶擦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起雇毫,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤玄捕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后棚放,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體枚粘,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年飘蚯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了馍迄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片福也。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖攀圈,靈堂內(nèi)的尸體忽然破棺而出暴凑,到底是詐尸還是另有隱情,我是刑警寧澤赘来,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布现喳,位于F島的核電站,受9級(jí)特大地震影響犬辰,放射性物質(zhì)發(fā)生泄漏嗦篱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一幌缝、第九天 我趴在偏房一處隱蔽的房頂上張望灸促。 院中可真熱鬧,春花似錦狮腿、人聲如沸腿宰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吃度。三九已至,卻和暖如春贴硫,著一層夾襖步出監(jiān)牢的瞬間椿每,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國打工英遭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留间护,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓挖诸,卻偏偏與公主長得像汁尺,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子多律,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • MongoDB 基礎(chǔ) 啟動(dòng) & 關(guān)閉 啟動(dòng) 若啟動(dòng)時(shí)痴突,不指定任何參數(shù), MongoDB 會(huì)默認(rèn)使用 /data/d...
    zcwfeng閱讀 532評(píng)論 0 2
  • 2017年1月狼荞,正值新年伊始辽装,一些黑客組織發(fā)動(dòng)了一場(chǎng)針對(duì)MongoDB數(shù)據(jù)庫的攻擊,全球有數(shù)以萬計(jì)的MongoDB...
    Mike的讀書季閱讀 2,450評(píng)論 0 4
  • 這里是閱讀了《MongoDB權(quán)威指南》后做的相關(guān)筆記。 一、文檔 文檔是MongoDB的核心概念拓巧。文檔就是鍵值對(duì)的...
    yjaal閱讀 644評(píng)論 0 4
  • 從2012年初開始斯碌,公司的一些核心產(chǎn)品準(zhǔn)備開始陸續(xù)遷移到MongoDB上,我們嘗試著從一個(gè)小產(chǎn)品開始使用玲销,陸續(xù)將其...
    UncleYee閱讀 1,966評(píng)論 0 3
  • 下載地址 https://www.mongodb.com/download-center MongoDB是CS架構(gòu)...
    JunChow520閱讀 612評(píng)論 0 0