MongoDB的基本操做包括文檔的建立、刪除、和更新mongodb
一、插入數據庫
#查看當前都有哪些數據庫 > show dbs; local 0.000GB tim 0.000GB #使用 tim數據庫 > use tim; switched to db tim #查看都有哪些集合 > show collections; user > db.user.in db.user.initializeOrderedBulkOp( db.user.insert( db.user.insertOne( db.user.initializeUnorderedBulkOp( db.user.insertMany( #使用insert方法插入文檔,以{}包注,文檔是以鍵值對出現的,必須成對設置 > db.user.insert({"uid":1,"name":"luotianshuai","age":18,"salary":1}) WriteResult({ "nInserted" : 1 }) >
二、查詢json
#經過find()方法進行查詢 > db.user.find() { "_id" : ObjectId("575f039f0c73a5a96e8f7c8f"), "uid" : 1, "name" : "luotianshuai", "age" : 18, "salary" : 1 } >
三、如何快速構造1萬條文檔呢?數組
能夠經過json的循環來實現dom
> for(i=2;i<=20;i++){ ... db.user.insert({"uid":i,"name":"luotianshuai"+i,"salary":2000+Math.round(Math.random())*5000}) ... } WriteResult({ "nInserted" : 1 }) >
總結:ui
插入一條文檔使用insert方法spa
文檔的規則是鍵值對,他們是成對出現的他們之間用逗號分隔,鍵和值經過冒號分隔。code
一、查詢全部blog
#db.user.find() 若是括號內不加任何條件那麼默認是顯示全部的文檔
二、查詢條件rem
> db.user.find({"uid":1}) #這裏指定條件 { "_id" : ObjectId("575f039f0c73a5a96e8f7c8f"), "uid" : 1, "name" : "luotianshuai", "age" : 18, "salary" : 1 }
三、刪除文檔
> db.user.remove({"uid":1}) WriteResult({ "nRemoved" : 1 }) #當removed爲1的時候說明刪除成功
四、清空集合
> db.user.remove({}) WriteResult({ "nRemoved" : 19 })
五、刪除集合
> db.user.drop() true #若是返回true說明刪除成功
先把以前刪除掉餓文檔建立一下:
for(i=2;i<=20;i++){ db.user.insert({"uid":i,"name":"luotianshuai"+i,"salary":2000+Math.round(Math.random())*5000}) }
一、更新文檔
更新文檔這裏經過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, "nUpserted" : 0, "nModified" : 1 }) > db.user.findOne({"uid":3}) { "_id" : ObjectId("575f068e0c73a5a96e8f7ca4"), "uid" : 3, "name" : "shuaige", "salary" : 2000 } >
能夠看到這個更新結果是咱們想要的結果,這種方式叫作文檔的替換方式更新!
可是咱們uid不須要變動,salary也不須要變動可是咱們都要寫出來!
二、變量替換方式
咱們能夠把取出來的值賦值給一個變量,而後經過變量去修改!
#把查詢到的值賦值給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"), "uid" : 4, "name" : "luotianshuai4", "salary" : 7000 } #而後在經過update更新 > db.user.update({"uid":4},a) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.user.findOne({"uid":4}) { "_id" : ObjectId("575f068e0c73a5a96e8f7ca5"), "uid" : 4, "name" : "dashuaige", "salary" : 7000 }
他的本質仍是替換的方式,只不過是方便了
三、使用修改器$inc更新
如何對uid爲10的用戶增長100塊錢工資
#這裏$inc遵循鍵值對的規則,他至關於鍵,要修改的內容爲值 > db.user.update({"uid":10},{"$inc":{"salary":100}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) #結果 { "_id" : ObjectId("575f068e0c73a5a96e8f7cab"), "uid" : 10, "name" : "luotianshuai10", "salary" : 7100 } #減100 > db.user.update({"uid":10},{"$inc":{"salary":-100}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) #結果 { "_id" : ObjectId("575f068e0c73a5a96e8f7cab"), "uid" : 10, "name" : "luotianshuai10", "salary" : 7000 }
四、添加一個字段$set修改器
有時候有需求要給某個文檔添加一個字段,好比年齡。使用$set
#添加器$set > db.user.update({"uid":10},{"$set":{"age":18}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) #結果 { "_id" : ObjectId("575f068e0c73a5a96e8f7cab"), "uid" : 10, "name" : "luotianshuai10", "salary" : 7000, "age" : 18 }
五、刪除一個字段$unset修改器
有時候有需求要求給某個文檔刪除一個字段,好比年齡。使用$unset
#這裏注意使用unset的時候他的值也是一個字典要刪除的字段:1 這個1,是true的意思刪除它,因此這個1是邏輯的true > db.user.update({"uid":10},{"$unset":{"age":1}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) #結果 { "_id" : ObjectId("575f068e0c73a5a96e8f7cab"), "uid" : 10, "name" : "luotianshuai10", "salary" : 7000 }
看上面使用$unset的時候age的值爲1說明爲true那咱們也能夠經過值爲true來刪除它,那麼咱們來刪除uid爲10的salary字段
#例子 > db.user.update({"uid":10},{"$unset":{"salary":true}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) 結果: { "_id" : ObjectId("575f068e0c73a5a96e8f7cab"), "uid" : 10, "name" : "luotianshuai10" }
六、更新文檔的其餘參數
> 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, "nUpserted" : 0, "nModified" : 0 }) #看上面的提示找到0,修改0,說明沒有更新,那麼第3個參數的做用就來了,給他設置爲true > db.user.update({"uid":100},{"uid":100,"name":"luotianshuai100","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, "nUpserted" : 0, "nModified" : 1 }) #能夠看到他只更新了匹配到的第一條數據那麼,第4個參數的做用就來了 > db.user.update({},{"$inc":{"salary":1000}},false,true) WriteResult({ "nMatched" : 20, "nUpserted" : 0, "nModified" : 20 }) > ''' 從上面能夠看出,第四個參數的做用就是設置爲true的時候就是匹配全部文檔 '''
總結:
第3個和第4個參數默認爲false
第一個爲查找的條件,第二個爲修改內容,第三個是是否在查不到的時候添加修改內容,第四個是是否匹配全部。
用Python理解的話就是字典中的字典和,字典中的列表~~!
先建立一個文檔,而後經過修改他來實際看下如何修改文檔中的文檔和文檔中的數組
> 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, "nUpserted" : 0, "nModified" : 1 }) > db.user.findOne() { "_id" : ObjectId("575f19c45e4f17980e7b3366"), "uid" : 1, "name" : "luotianshuai", "content" : { "addr" : "beijing", "code" : 10085, "qq" : "1234567" }, "email" : [ "a" ] } >
$push 是在元組中增長一個元素,會在數組的最後追加元素
二、$pushAll 在元組中增長多個元素,可是他不檢查元素是否存在
以下:b已經存在了,我再同時增長b,c,d看下是什麼結果
> db.user.update({"uid":1},{"$push":{"email":"b"}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.user.findOne() { "_id" : ObjectId("575f1b9a5e4f17980e7b3367"), "uid" : 1, "name" : "luotianshuai", "content" : { "addr" : "beijing", "code" : 10085, "qq" : "1234567" }, "email" : [ "a", "b" ] } >
$pushAll
> db.user.update({"uid":1},{"$pushAll":{"email":["b","c","d"]}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.user.findOne() { "_id" : ObjectId("575f1b9a5e4f17980e7b3367"), "uid" : 1, "name" : "luotianshuai", "content" : { "addr" : "beijing", "code" : 10085, "qq" : "1234567" }, "email" : [ "a", "b", "b", "c", "d" ] } >
三、$addToSet 往數組中添加一個不重複的元素
> db.user.update({"uid":1},{"$addToSet":{"email":"d"}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 }) > #從上面的結果能夠看出匹配到了一個,插入和修改了0個,說明他能夠判斷元素是否存在
添加一個元素
#若是不存在就建立 > db.user.update({"uid":1},{"$addToSet":{"email":"e"}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) >
添加多個不重複的元素,這時候就得須要用到$eache操做符了
#這裏e,d都是存在的而後g,f是不存在的批量插入看下結果 > db.user.update({"uid":1},{"$addToSet":{"email":{"$each":["e","g","f","d"]}}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) #結果 > db.user.findOne() { "_id" : ObjectId("575f1b9a5e4f17980e7b3367"), "uid" : 1, "name" : "luotianshuai", "content" : { "addr" : "beijing", "code" : 10085, "qq" : "1234567" }, "email" : [ "a", "b", "b", "c", "d", "e", "g", "f" ] } >
總結:
db.user.update({"uid":1},{"$push":{"email":"a"}}) #在數組末尾添加一個元素
db.user.update({"uid":1},{"$pushAll":{"email":["b","c","d"]}}) #在數組末尾添加多個元素,且並不檢查是否重複
db.user.update({"uid":1},{"$addToSet":{"email":"d"}}) #向數組添加一個不重複的元素
#在實際的生產中可能須要插入多個不重複的元素可使用$addToSet 結合$eache操做符
db.user.update({"uid":1},{"$addToSet":{"email":{"$each":["e","g","f","d"]}}})
2、刪除數組元素
一、$pop 從數組中1個值,只能從開頭和結尾取值
$pop是從數組中的開頭和結尾刪除一個值
從上面的結果能夠看出,$pop操做符的值中數組的值,爲正數的時候從數組的右側刪值,爲負數的時候從數組的左側取值
二、$pull刪除指定的數組指定的一個元素
三、$pullAll 刪除多個指定的數組元素
總結:
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"]}}) #刪除數組內指定的多個元素
3、數組元素的更新
一、經過變量調用下標修改
> db.user.findOne() { "_id" : ObjectId("575f21df5e4f17980e7b3369"), "uid" : 1, "name" : "luotianshuai", "content" : { "addr" : "beijing", "code" : 10085, "qq" : "1234567" }, "email" : [ "d", "e" ] } > a = db.user.findOne() { "_id" : ObjectId("575f21df5e4f17980e7b3369"), "uid" : 1, "name" : "luotianshuai", "content" : { "addr" : "beijing", "code" : 10085, "qq" : "1234567" }, "email" : [ "d", "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},a) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.user.findOne() { "_id" : ObjectId("575f21df5e4f17980e7b3369"), "uid" : 1, "name" : "luotianshuai", "content" : { "addr" : "beijing", "code" : 10085, "qq" : "1234567" }, "email" : [ "d", "shuaige.qq.com" ] } >
二、經過數組.下標修改
> db.user.findOne() { "_id" : ObjectId("575f21df5e4f17980e7b3369"), "uid" : 1, "name" : "luotianshuai", "content" : { "addr" : "beijing", "code" : 10085, "qq" : "1234567" }, "email" : [ "d", "shuaige.qq.com" ] } > db.user.update({"uid":1},{"$set":{"email.0":"tim.qq.com"}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.user.findOne() { "_id" : ObjectId("575f21df5e4f17980e7b3369"), "uid" : 1, "name" : "luotianshuai", "content" : { "addr" : "beijing", "code" : 10085, "qq" : "1234567" }, "email" : [ "tim.qq.com", "shuaige.qq.com" ] } >
上面的emil.0 至關於emil[0] 經過下標調用mongodb能識別它!
4、文檔的文檔修改
看下面的例子說明,文檔的文檔能夠經過「.」分法一級一級的嵌套下去修改他以下
一、查詢
> b = db.user.findOne() { "_id" : ObjectId("575f21df5e4f17980e7b3369"), "uid" : 1, "name" : "luotianshuai", "content" : { "addr" : "beijing", "code" : 10085, "qq" : "1234567" }, "email" : [ "tim.qq.com", "shuaige.qq.com" ] } > b.con b.constructor b.content > b.content { "addr" : "beijing", "code" : 10085, "qq" : "1234567" } > b.content.addr beijing > b.content.addr
二、修改
> b.content.code = 123456789 123456789 > b { "_id" : ObjectId("575f21df5e4f17980e7b3369"), "uid" : 1, "name" : "luotianshuai", "content" : { "addr" : "beijing", "code" : 123456789, "qq" : "1234567" }, "email" : [ "tim.qq.com", "shuaige.qq.com" ] } > db.user.update({"uid":1},b) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.user.findOne() { "_id" : ObjectId("575f21df5e4f17980e7b3369"), "uid" : 1, "name" : "luotianshuai", "content" : { "addr" : "beijing", "code" : 123456789, "qq" : "1234567" }, "email" : [ "tim.qq.com", "shuaige.qq.com" ] } >