1. 程式人生 > 資料庫 >mongodb使用命令總結

mongodb使用命令總結

登陸

./mongo 10.14.101.221:27017 進入開發環境
use admin 切換資料庫,如果不存在則建立
db.auth("lightsystem","abc12345") 登陸有密碼的使用者
show dbs|show databases 顯示所有資料庫
dbs 當前所在的資料庫							
mongos> run("ls","-l","/home/robin") 在mongo中環境下執行linux系統命令
load("xxx.js") 執行js指令碼
db.static_human.find({}).skip(290) 跳轉到具體行數獲取資訊
db.getName() 顯示當前使用的資料庫名稱
.pretty() 格式化輸出​	
help Mongodb shell 中輸入,可以檢視最高級別的幫助資訊
db.help()	進入資料庫後使用db.help()查詢資料庫級別的幫助資訊

資料匯入

db.users.insert({user_id:"abc123",age:55,status:"A"}) 向資料庫中集合寫入資料,如果沒有就建立
p={name:"王丹",age:18} 或者採用賦值的方式寫入資料
db.person.insert(p)
db.person.save(p) insert和save功能一樣
for(var i=1;i<5;i++) db.person.insert{{"name":"王丹","age":i}} mongodb內部支援js,可以使用js命令
for(i=2;i<=20;i++){
... db.user.insert({"uid":i,"name":"luotianshuai"+i,"salary":2000+Math.round(Math.random())*5000})
... }

刪除

db.user.remove({"name":"zhangshan"}) 刪除匹配欄位
db.collection1.remove({age:7,name:"xiaomu"}) 刪除age為7,name為xiaomu的資料
db.user.remove({}) 刪除所有資料
db.user.drop() 刪除集合
db.dropDatabase() 進入具體資料庫中執行,可刪除檔期資料庫

索引相關

db.col.getIndexes() 檢視集合索引
db.col.totalIndexSize() 檢視集合索引大小
db.col.dropIndexes() 刪除集合所有索引
db.col.dropIndex("索引名稱") 刪除集合指定索引
db.c3.ensureIndex({age:1}) 為age欄位建普通索引
db.c3.dropIndex({age:1}) 刪除age欄位的索引
db.c3.ensureIndex({age:1},{unique:true}) 為age欄位建唯一索引,在為欄位建了唯一索引後就不能再新增相同值的記錄了
db.values.createIndex({open: 1,close: 1},{background: true}) 在後臺中建立索引
db.col.createIndex({"title":1,"description":-1})  建立複合索引

資料庫查詢相關功能

db.aaa.find().limit(2).skip(0).sort({device_type:-1}) 1:表示升序排序,-1:表示降序排序
db.aaa.find({version:1}) 僅獲取version為1的資訊條
db.news.find( {},{ id: 1,title: 1 } ) 只輸出id和title欄位,第一引數為查詢條件,空代表查詢所有
db.news.find( {},{content: 0 } ) 除過content欄位,輸出其餘欄位
db.inventory.find( { type: 'food' } ) 返回type欄位為food的資訊段
db.inventory.find( { type: 'food' },{ item: 1,qty: 1,_id:0 } ) 指定某些欄位,排除某些欄位
db.collection1.findOne() 查詢集合的第一條資料
db.users.count() 當前資料庫中資料條數	
db.aaa.find({plate_no:{$regex:'京A'}}) 模糊匹配

集合相關

db.createCollection("collectionName") 建立集合
show collections|show tables 檢視當前資料庫中的集合
db.collection1.count() 統計集合collection1中的資料數量
db.createCollection("collectionName",{capped:true,size:10000,max:100}) size指定集合大小,單位為KB,max指定文件數量

資料備份與恢復

備份: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
-h:mongodb所在伺服器地址,如127.0.0.1,當然也可以指定埠號:127.0.0.1:27017
-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 檔案的地址路徑
-h:資料庫地址
-d:指明使用的庫
-c:指明要匯出的集合
注意:匯入時要在退出mongo命令列狀態下執行,匯入匯出與資料備份和恢復相似

資料更新

1、笨辦法
更新文件這裡通過update方法括號內,第一個文件為查詢的文件,第二個文件為修改為什麼文件!
> db.user.update({"uid":2},{"name":"shuaige"})
WriteResult({ "nMatched" : 1,"nUpserted" : 0,"nModified" : 1 })
通過檢視這種更新方式,後面的文件會覆蓋我們要修改文件的整個內容,就變成下面的內容了。uid欄位salary欄位都被覆蓋掉了
> db.user.find()
{ "_id" : ObjectId("575f068e0c73a5a96e8f7ca3"),"name" : "shuaige" }
所以用下面的方法可以
>  db.user.update({"uid":3},{"uid" : 3,"name" : "shuaige","salary" : 2000 })
WriteResult({ "nMatched" : 1,"nModified" : 1 })
> db.user.findOne({"uid":3})
{
        "_id" : ObjectId("575f068e0c73a5a96e8f7ca4"),"uid" : 3,"salary" : 2000
}
>
可以看到這個更新結果是我們想要的結果,這種方式叫做文件的替換方式更新!
但是我們uid不需要變更,salary也不需要變更但是我們都要寫出來


2、變數替換方式
我們可以把取出來的值賦值給一個變數,然後通過變數去修改!
#把查詢到的值賦值給a
> a = db.user.findOne({"uid":4})
{
        "_id" : ObjectId("575f068e0c73a5a96e8f7ca5"),"uid" : 4,"name" : "luotianshuai4","salary" : 7000
}
> a.name
luotianshuai4
#通過變數.欄位名去修改欄位的內容
> a.name="dashuaige"
dashuaige
> db.user.findOne({"uid":4})
{
        "_id" : ObjectId("575f068e0c73a5a96e8f7ca5"),"salary" : 7000
}
#然後在通過update更新
> db.user.update({"uid":4},a)
WriteResult({ "nMatched" : 1,"nModified" : 1 })
> db.user.findOne({"uid":4})
{
        "_id" : ObjectId("575f068e0c73a5a96e8f7ca5"),"name" : "dashuaige","salary" : 7000
}
他的本質還是替換的方式,只不過是方便了

3、使用修改器$inc更新
如何對uid為10的使用者增加100塊錢工資
#這裡$inc遵循鍵值對的規則,他相當於鍵,要修改的內容為值
> db.user.update({"uid":10},{"$inc":{"salary":100}})
WriteResult({ "nMatched" : 1,"nModified" : 1 })
#結果
{ "_id" : ObjectId("575f068e0c73a5a96e8f7cab"),"uid" : 10,"name" : "luotianshuai10","salary" : 7100 }
#減100
> db.user.update({"uid":10},{"$inc":{"salary":-100}})
WriteResult({ "nMatched" : 1,"salary" : 7000 }

4、新增一個欄位$set修改器
有時候有需求要給某個文件新增一個欄位,比如年齡。使用$set
#新增器$set
> db.user.update({"uid":10},{"$set":{"age":18}})
WriteResult({ "nMatched" : 1,"salary" : 7000,"age" : 18 }

5、刪除一個欄位$unset修改器
有時候有需求要求給某個文件刪除一個欄位,比如年齡。使用$unset
#這裡注意使用unset的時候他的值也是一個字典要刪除的欄位:1 這個1,是true的意思刪除它,所以這個1是邏輯的true
> db.user.update({"uid":10},{"$unset":{"age":1}})
WriteResult({ "nMatched" : 1,"salary" : 7000 }
看上面使用$unset的時候age的值為1說明為true那我們也可以通過值為true來刪除它,那麼我們來刪除uid為10的salary欄位
#例子
> db.user.update({"uid":10},{"$unset":{"salary":true}})
WriteResult({ "nMatched" : 1,"nModified" : 1 })
結果:
{ "_id" : ObjectId("575f068e0c73a5a96e8f7cab"),"name" : "luotianshuai10" }

6、更新文件的其他引數
> db.user.update({arg1},{arg2},arg3,arg4)
'''
引數1:條件     #通過他來查詢
引數2:需要操作的更新內容      #把找到的文件修改
引數3:
參宿4:
'''
#引數3是做什麼呢?
咱們看下下面一種情況:
如果我現在想更新一條資料uid為100,我這裡是沒有這個uid為100的文件的
> db.user.find({"uid":100}) #為空
那麼現在我修改他下那麼會成功的修改嗎?
> db.user.update({"uid":100},{"uid":100,"name":"luotianshuai100","salary":100})
WriteResult({ "nMatched" : 0,"nModified" : 0 })
#看上面的提示找到0,修改0,說明沒有更新,那麼第3個引數的作用就來了,給他設定為true
> db.user.update({"uid":100},"salary":100},true)
WriteResult({
        "nMatched" : 0,"nUpserted" : 1,#當查詢不到的時候,我們插入它
        "nModified" : 0,"_id" : ObjectId("575f12ee7732f402fffdf61b")
})
> 
#檢視下,他更新成功了
{ "_id" : ObjectId("575f12ee7732f402fffdf61b"),"uid" : 100,"name" : "luotianshuai100","salary" : 100 }

'''
so  那麼第三個引數的含義就展現出來了,如果查詢不到條件,那麼就插入我們修改的內容
'''
#引數4的含義
現在有個需求我現在需要給所有的員工加10000塊錢,來看下我的操作
> db.user.update({},{"$inc":{"salary":1000}})
WriteResult({ "nMatched" : 1,"nModified" : 1 })

#可以看到他只更新了匹配到的第一條資料那麼,第4個引數的作用就來了
> db.user.update({},{"$inc":{"salary":1000}},false,true)
WriteResult({ "nMatched" : 20,"nModified" : 20 })
> 
'''
從上面可以看出,第四個引數的作用就是設定為true的時候就是匹配所有文件
'''

更新文件中的文件和更新文件中的陣列

先建立一個文件,然後通過修改他來實際看下如何修改文件中的文件和文件中的陣列

> db.user.insert({"uid":1,"name":"luotianshuai","content":{"addr":"beijing","code":10085,"qq":"1234567"},"email":[]})
WriteResult({ "nInserted" : 1 })
> db.user.findOne()
{
        "_id" : ObjectId("575f19c45e4f17980e7b3366"),"uid" : 1,"name" : "luotianshuai","content" : {
                "addr" : "beijing","code" : 10085,"qq" : "1234567"
        },"email" : [ ]
}
> 

一、陣列的更新
1、陣列增加元素$push

> db.user.update({"uid":1},{"$push":{"email":"a"}})
WriteResult({ "nMatched" : 1,"nModified" : 1 })
> db.user.findOne()
{
        "_id" : ObjectId("575f19c45e4f17980e7b3366"),"email" : [
                "a"
        ]
}
> 

$push 是在元組中增加一個元素,會在陣列的最後追加元素
2、$pushAll 在元組中增加多個元素,但是他不檢查元素是否存在
如下:b已經存在了,我再同時增加b,c,d看下是什麼結果

> db.user.update({"uid":1},{"$push":{"email":"b"}})
WriteResult({ "nMatched" : 1,"nModified" : 1 })
> db.user.findOne()
{
        "_id" : ObjectId("575f1b9a5e4f17980e7b3367"),"email" : [
                "a","b"
        ]
}
> 

$pushAll

> db.user.update({"uid":1},{"$pushAll":{"email":["b","c","d"]}})
WriteResult({ "nMatched" : 1,"b","d"
        ]
}
> 

3、$addToSet 往陣列中新增一個不重複的元素
> db.user.update({"uid":1},{"$addToSet":{"email":"d"}})
WriteResult({ "nMatched" : 1,"nModified" : 0 })
> 
#從上面的結果可以看出匹配到了一個,插入和修改了0個,說明他可以判斷元素是否存在
新增一個元素
#如果不存在就建立
> db.user.update({"uid":1},{"$addToSet":{"email":"e"}})
WriteResult({ "nMatched" : 1,"nModified" : 1 })
> 
新增多個不重複的元素,這時候就得需要用到$eache操作符了

#這裡e,d都是存在的然後g,f是不存在的批量插入看下結果
> db.user.update({"uid":1},{"$addToSet":{"email":{"$each":["e","g","f","d"]}}})
WriteResult({ "nMatched" : 1,"nModified" : 1 })

#結果
> db.user.findOne()
{
        "_id" : ObjectId("575f1b9a5e4f17980e7b3367"),"d","e","f"
        ]
}
> 

總結:
db.user.update({"uid":1},{"$push":{"email":"a"}})  #在陣列末尾新增一個元素
db.user.update({"uid":1},"d"]}}) #在陣列末尾新增多個元素,且並不檢查是否重複
db.user.update({"uid":1},{"$addToSet":{"email":"d"}}) #向陣列新增一個不重複的元素
#在實際的生產中可能需要插入多個不重複的元素可以使用$addToSet 結合$eache操作符
db.user.update({"uid":1},"d"]}}})
    
    
二、刪除陣列元素
db.user.update({"uid":1},{"$pop":{"email":-1}}) #從左側刪除一個元素
db.user.update({"uid":1},{"$pop":{"email":1}})#從右側刪除一個元素
db.user.update({"uid":1},{"$pull":{"email":"b"}}) #刪除陣列內的指定一個元素
db.user.update({"uid":1},{"$pullAll":{"email":["b","c"]}}) #刪除陣列內指定的多個元素

三、陣列元素的更新
1、通過變數呼叫下標修改

> db.user.findOne()
{
        "_id" : ObjectId("575f21df5e4f17980e7b3369"),"email" : [
                "d","e"
        ]
}
> a = db.user.findOne()
{
        "_id" : ObjectId("575f21df5e4f17980e7b3369"),"e"
        ]
}
> a.email
[ "d","e" ]
> a.email[0]
d
> a.email[1]
e
> a.email[1] = "shuaige.qq.com"
shuaige.qq.com
> db.user.update({"uid":1},"nModified" : 1 })
> db.user.findOne()
{
        "_id" : ObjectId("575f21df5e4f17980e7b3369"),"shuaige.qq.com"
        ]
}
> 

2、通過陣列.下標修改

> db.user.findOne()
{
        "_id" : ObjectId("575f21df5e4f17980e7b3369"),"shuaige.qq.com"
        ]
}
> db.user.update({"uid":1},{"$set":{"email.0":"tim.qq.com"}})
WriteResult({ "nMatched" : 1,"email" : [
                "tim.qq.com","shuaige.qq.com"
        ]
}
> 
上面的emil.0 相當於emil[0]  通過下標呼叫mongodb能識別它!

四、文件的文件修改
看下面的例子說明,文件的文件可以通過“.”分法一級一級的巢狀下去修改他如下
1、查詢

> b = db.user.findOne()
{
        "_id" : ObjectId("575f21df5e4f17980e7b3369"),"shuaige.qq.com"
        ]
}
> b.con
b.constructor  b.content
> b.content
{ "addr" : "beijing","qq" : "1234567" }
> b.content.addr
beijing
> b.content.addr 

2、修改

> b.content.code = 123456789
123456789
> b
{
        "_id" : ObjectId("575f21df5e4f17980e7b3369"),"code" : 123456789,b)
WriteResult({ "nMatched" : 1,"shuaige.qq.com"
        ]
}
>