MongoDB---基本操作
MongoDB的基本操作包括文件的建立、刪除、和更新
文件插入
1、插入
#檢視當前都有哪些資料庫 > 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 }) >
2、查詢
#通過find()方法進行查詢 > db.user.find() { "_id" : ObjectId("575f039f0c73a5a96e8f7c8f"), "uid" : 1, "name" : "luotianshuai", "age" : 18, "salary" : 1 } >
3、如何快速構造1萬條文件呢?
可以通過json的迴圈來實現
> for(i=2;i<=20;i++){ ... db.user.insert({"uid":i,"name":"luotianshuai"+i,"salary":2000+Math.round(Math.random())*5000}) ... } WriteResult({ "nInserted" : 1 }) >
總結:
插入一條文件使用insert方法
文件的規則是鍵值對,他們是成對出現的他們之間用逗號分隔,鍵和值通過冒號分隔。
刪除文件
1、查詢所有
#db.user.find() 如果括號內不加任何條件那麼預設是顯示所有的文件
2、查詢條件
> db.user.find({"uid":1}) #這裡指定條件 { "_id" : ObjectId("575f039f0c73a5a96e8f7c8f"), "uid" : 1, "name" : "luotianshuai", "age" : 18, "salary" : 1 }
3、刪除文件
> db.user.remove({"uid":1}) WriteResult({ "nRemoved" : 1 }) #當removed為1的時候說明刪除成功
4、清空集合
> db.user.remove({}) WriteResult({ "nRemoved" : 19 })
5、刪除集合
> 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}) }
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, "nUpserted" : 0, "nModified" : 1 }) > db.user.findOne({"uid":3}) { "_id" : ObjectId("575f068e0c73a5a96e8f7ca4"), "uid" : 3, "name" : "shuaige", "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"), "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 }
他的本質還是替換的方式,只不過是方便了
3、使用修改器$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 }
4、新增一個欄位$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 }
5、刪除一個欄位$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" }
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, "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 是在陣列中增加一個元素,會在陣列的最後追加元素
2、$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" ] } >
3、$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 }) >
新增多個不重複的元素,這時候就得需要用到$each操作符了
#這裡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"]}}})
二、刪除陣列元素
1、$pop 從陣列中1個值,只能從開頭和結尾取值
$pop是從陣列中的開頭和結尾刪除一個值
從上面的結果可以看出,$pop操作符的值中陣列的值,為正數的時候從陣列的右側刪值,為負數的時候從陣列的左側取值
2、$pull刪除指定的陣列指定的一個元素
3、$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"]}}) #刪除陣列內指定的多個元素
三、陣列元素的更新
1、通過變數呼叫下標修改
> 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" ] } >
2、通過陣列.下標修改
> 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能識別它!
四、文件的文件修改
看下面的例子說明,文件的文件可以通過“.”分法一級一級的巢狀下去修改他如下
1、查詢
> 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
2、修改
> 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" ] } >
文件插入
1、插入
#檢視當前都有哪些資料庫 > 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 }) >
2、查詢
#通過find()方法進行查詢 > db.user.find() { "_id" : ObjectId("575f039f0c73a5a96e8f7c8f"), "uid" : 1, "name" : "luotianshuai", "age" : 18, "salary" : 1 } >
3、如何快速構造1萬條文件呢?
可以通過json的迴圈來實現
> for(i=2;i<=20;i++){ ... db.user.insert({"uid":i,"name":"luotianshuai"+i,"salary":2000+Math.round(Math.random())*5000}) ... } WriteResult({ "nInserted" : 1 }) >
總結:
插入一條文件使用insert方法
文件的規則是鍵值對,他們是成對出現的他們之間用逗號分隔,鍵和值通過冒號分隔。
刪除文件
1、查詢所有
#db.user.find() 如果括號內不加任何條件那麼預設是顯示所有的文件
2、查詢條件
> db.user.find({"uid":1}) #這裡指定條件 { "_id" : ObjectId("575f039f0c73a5a96e8f7c8f"), "uid" : 1, "name" : "luotianshuai", "age" : 18, "salary" : 1 }
3、刪除文件
> db.user.remove({"uid":1}) WriteResult({ "nRemoved" : 1 }) #當removed為1的時候說明刪除成功
4、清空集合
> db.user.remove({}) WriteResult({ "nRemoved" : 19 })
5、刪除集合
> 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}) }
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, "nUpserted" : 0, "nModified" : 1 }) > db.user.findOne({"uid":3}) { "_id" : ObjectId("575f068e0c73a5a96e8f7ca4"), "uid" : 3, "name" : "shuaige", "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"), "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 }
他的本質還是替換的方式,只不過是方便了
3、使用修改器$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 }
4、新增一個欄位$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 }
5、刪除一個欄位$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" }
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, "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 是在陣列中增加一個元素,會在陣列的最後追加元素
2、$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" ] } >
3、$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 }) >
新增多個不重複的元素,這時候就得需要用到$each操作符了
#這裡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"]}}})
二、刪除陣列元素
1、$pop 從陣列中1個值,只能從開頭和結尾取值
$pop是從陣列中的開頭和結尾刪除一個值
從上面的結果可以看出,$pop操作符的值中陣列的值,為正數的時候從陣列的右側刪值,為負數的時候從陣列的左側取值
2、$pull刪除指定的陣列指定的一個元素
3、$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"]}}) #刪除陣列內指定的多個元素
三、陣列元素的更新
1、通過變數呼叫下標修改
> 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" ] } >
2、通過陣列.下標修改
> 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能識別它!
四、文件的文件修改
看下面的例子說明,文件的文件可以通過“.”分法一級一級的巢狀下去修改他如下
1、查詢
> 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
2、修改
> 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" ] } >