天天看點

MongoDB基礎知識筆記安裝MongoDB:集合:查詢:篩選查詢:包含排序:删除:更新索引資料備份與恢複導入與導出

安裝MongoDB:

mongoDB

curl -O

https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6.tgz

# 下載下傳

tar -zxvf mongodb-linux-x86_64-3.0.6.tgz # 解壓

mv mongodb-linux-x86_64-3.0.6/ /usr/local/mongodb # 将解壓包拷貝到指定目錄

MongoDB 的可執行檔案位于 bin 目錄下,是以可以将其添加到 PATH 路徑中:

export PATH=/usr/local/mongodb/bin:$PATH

建立資料庫目錄:

MongoDB的資料存儲在data目錄的db目錄下,但是這個目錄在安裝過程不會自動建立,是以你需要手動建立data目錄,并在data目錄中建立db目錄。

mkdir -p /data/db

mkdir -p /logs

進入安裝路徑:

建立mongodb.conf配置檔案:vim mongodb.conf

dbpath = /data/db #資料檔案存放目錄

logpath = /logs/mongodb.log #日志檔案存放目錄

port = 27017 #端口

fork = true #以守護程式的方式啟用,即在背景運作

auth=true #需要認證。如果放開注釋,就必須建立MongoDB的賬号,使用賬号與密碼才可遠端通路,第一次安裝建議注釋

bind_ip=0.0.0.0 #允許遠端通路,或者直接注釋,127.0.0.1是隻允許本地通路

指令行中運作 MongoDB 服務:

./mongod -f mongodb.conf

檢視端口映射檢查是否啟動成功:

netstat -nltp|grep mongod

mongod指令關閉:mongod 指令的 shutdown 選項能幹淨的關閉 MongoDB 服務,會釋放記憶體中MongoDB占用的記憶體

./mongod --shutdown

kill MongoDB的pid ,直接殺死MongoDB的程序id。kill -9 pid 強制殺死,有時可能會出現錯誤關不掉時就可使用這種強制方式,

但注意這種方式可能并不會馬上釋放記憶體中MongoDB占用的記憶體,且如果這時候有資料往MongoDB新增可能會導緻資料丢失。

注:檢視pid:ps -ef | grep mongo , 結果的第二列就是pid。

進入mongodb中:

./mongo

使用admin資料庫:use admin ,注意admin資料庫下建立的賬号權限是所有庫通用的,即是全局認證的。

建立使用者:db.createUser({ user: 'root', pwd: 'root',roles: [ { role: "dbOwner", db: "test" }] })

這時候MongoDB的admin資料庫就有了賬号,啟用auth=true,重新開機後,再連接配接就需要賬号密碼授權了。

db.firstCollection.save({"name":"gaojianshuai","age":"25"})

可檢視是否新增成功:db.firstCollection.find({name:"gaojianshuai"})

mongodb文法

資料庫:

show dbs;//檢視所有的資料庫

db;//檢視目前視窗所在的資料庫

use 資料庫名;//如果資料庫不存在,則建立資料庫,否則切換到指定資料庫。

注:show dbs執行結果沒有看到test庫,但是db檢視目前庫确是test庫,因為test庫中剛開始沒有任何資料并且是在記憶體中的,有了資料後就會顯示出來了(其他新建立的資料庫也是如此)

db.dropDatabase();//删除目前資料庫,預設為 test,故要切換到某個資料庫下進行删除

集合:

顯式建立集合:**db.createCollection("collectionName");//建立一個名為collectionName的集合,建立完成後會傳回 {"ok",1} json串

隐式建立集合:db.collection2.insert({name:"xiaomu",age:20});//往collection2集合中添加資料來建立集合,如果集合不存在就自動建立集合,傳回:WriteResult({"nInserted":1})

show collections;//檢視集合

db.collection1.count();//統計集合collection1中的資料數量

db.collection1.drop();//删除集合collection1

注:mongo中支援js,可通過js操作實作批零處理,如:for(var i=0;i<1000;i++){db.collection2.insert({name:"xiaomu"+i,age:20+i});}

固定集合

固定集合指的是事先建立而且大小固定的集合。

固定集合特性:固定集合很想環形隊列,如果空間不足,最早的文檔就會被删除,為新的文檔騰出空間。一般來說,固定集合适用于任何想要自動淘汰過期屬性的場景,沒有太多的操作限制.

db.createCollection("collectionName",{capped:true,size:10000,max:100});//size指定集合大小,機關為KB,max指定文檔數量

當文檔數量上限時必須同時指定大小。淘汰機制隻有在容量還沒滿時才會依據數量來工作。要是容量滿了則會依據容量來工作。

查詢:

固定條件查詢:

注:mongodb中每條資料都有一個id,用來唯一辨別一條資料,id由mongo本身來維護

db.collection1.find();//查詢集合中所有的資料

db.collection1.find({age:7});//查詢年齡為7的資料

db.collection1.find({age:7},{name:1});

//查詢年齡為7的資料,隻傳回name字段資料;兩個大括号,前面的存查詢條件,後面的存傳回條件,傳回條件字段1表示true,表示此字段傳回,如果name後面的1改為0則表示不傳回name字段,傳回除name字段以外的其他字段

注意:如果設定傳回字段有為0的已經表示查詢所有除了某字段以外的所有字段就不能再設定某個字段為1了,有文法沖突

db.collection1.find({age:7,name:"xiaomu"},{name:1,age:1});//查詢age為7,name為xiaomu的資料,傳回name和age字段

注:多條件查詢此處是并列,但是如果多個條件都相同的話如{name:"xiaoli",name:"xioamu"}則會隻查詢後一個條件的資料

db.collection1.find({},{age:1});//查詢所有的資料,傳回age字段

db.collection1.findOne();//查詢集合的第一條資料

篩選查詢:

gt(greater than)大于;lt(less than)小于;gte(greater then equal)大于等于;lte(less than equal)小于等于;ne(not equal)不等于

db.collection1.find({age:{$gt:10}});//查詢age大于10的資料

包含

db.collection1.find({price:{$all:[1,2]}});//(包含。。并且包含。。)此處price是個數組,此方法查詢所有price包含1和2的資料

db.collection1.find({price:{$in:[1,2]}});//(包含。。或者包含。。)查詢price中含有1或者2的資料

db.collection1.find({price:{$nin:[1,2]}});//(不包含。。并且不包含。。)查詢price中不含有1并且不含有2的資料

db.collection1.find({$or:[{name:"xiaomu"},{price:{$in:[3]}}]});//(。。或者。。)查詢name為xiaomu或者價格包含3的資料

db.collection1.find({$nor:[{name:"xiaomu"},{name:"xiaoli"}]});//(既不也不)查詢name不為xiaomu或者name不為xiaoli的資料

分頁:

db.collection1.find().skip(0).limit(10);//查詢從0條開始,查詢10條,skip()方法預設參數為 0 ,表示跳過的條數

排序:

db.collection1.find().sort({age:1});//按照年齡升序排序,為-1的話表示降序排序

存在

db.c2.find({hight:{$exists:1}});//查詢存在hight字段的資料

删除:

db.collection1.remove({age:7,name:"xiaomu"});//删除age為7,name為xiaomu的資料

更新

db.c3.update({age:12},{name:"xiaoxiao"});//本意為将age為12的資料中的name更新為xiaoxiao,但是實際效果是隻是将age為12的滿足條件資料的第一條整條資料覆寫為name:“xiaoxiao”

db.c3.update({age:15},{$set:{name:"xiaolili"}});//本意為将age為15的資料的name修改為xiaolili,但是實際效果是隻修改了查詢到的第一條資料

db.c3.update({age:15},{$set:{name:"xiaolili"}},1,1);//将age為15的資料的name修改為xiaolili

總共4個參數,第四個參數表示有多條資料符合篩選條件的話是否全部更改,預設為0隻改第一條,改為1後表示全部更改

第3個參數1表示如果沒有符合條件的記錄是否新增一條記錄,1表示新增,0表示不新增

如:db.c3.update({age:21},{$set:{name:"xiaolili"}},1,1);//如果不存在age為21的資料則增加一條,增加的資料為{age:12,name:”xiaolili”}

db.c3.update({age:12},{name:"xiaoxiao"},{$inc:{age:-2}},1,1);//$inc表示使某個鍵值加減指定的數值,此處表示将name為xiaoxiao的資料的age字段的值減2

db.c3.update({age:12},{name:"xiaoxiao"},{$inc:{age:1}},0,1);//$unset用來删除某個鍵,此處表示删除name為xiaoxiao的資料的age字段

索引

mongo預設為每條資料的_id字段建索引

db.c3.ensureIndex({age:1});//為age字段建普通索引

db.c3.dropIndex({age:1});//删除age字段的索引

db.c3.ensureIndex({age:1},{unique:true});//為age字段建唯一索引,在為字段建了唯一索引後就不能再添加相同值的記錄了

資料備份與恢複

備份:mongodump -h dbhost -d dbname -o dbdirectory

-h:mongodb所在伺服器位址,如127.0.0.1,當然也可以指定端口号:127.0.0.1:27017

-d:需要備份的資料庫執行個體,如:test

-o:需要備份的資料存放的位置,例如:d:data (如果沒有則自動建立)

恢複:mongorestore -h dbhost -d dbname -directoryperdb dbdirectory

-d:需要備份的資料庫執行個體,如:test,此名稱也可以和備份的時候不一樣

-directoryperdb :備份資料所在的位置,例如:d:data

注意:恢複時要在退出mongo指令行狀态下執行

導入與導出

導出:mongoexport -h dbhost -d dbname -c collectionName -o output

-h:資料庫位址

-d:指明使用的庫

-c:指明要導出的集合

-o:指明要導出的檔案路徑加檔案名,檔案名可以是txt、word、excel等多種檔案格式

導入:mongoimport -h dbhost -d dbname -c collectionname 檔案的位址路徑

注意:導入時要在退出mongo指令行狀态下執行,導入導出與資料備份和恢複相似