MongoDB數據修改總結

MongoDB數據修改總結
2013-10-26 10:08:30      我來講兩句     來源:huhui的專欄   
收藏  我要投稿
MongoDB數據修改總結
 
1.前言
最近在學習MongoDB,數據修改這一部分的內容較多,命令比較繁瑣,因此將一些經常使用的修改命令總結在這篇博客中,方便從此學習的查閱。
2.命令總結
1). insert()
db.collection.insert(x)  x就是要更新的對象,只能是單條記錄,如:
[plain]
db.collection.insert({_id:1,name:"test",count:1}) 
當須要批量插入的時候,能夠在shell中使用for循環,如:
[plain]
for(var i=0;i<16;i++){  
     db.mytest.insert({_id:i,name:"test"+i,count:i})  
此時若是用find()命令查詢插入的數據,結果是這樣的:
[plain]
> db.mytest.find() 
{ "_id" : 0, "name" : "test0", "count" : 0 }
{ "_id" : 1, "name" : "test1", "count" : 1 }
{ "_id" : 2, "name" : "test2", "count" : 2 }
{ "_id" : 3, "name" : "test3", "count" : 3 }
{ "_id" : 4, "name" : "test4", "count" : 4 }
{ "_id" : 5, "name" : "test5", "count" : 5 }
{ "_id" : 6, "name" : "test6", "count" : 6 }
{ "_id" : 7, "name" : "test7", "count" : 7 }
{ "_id" : 8, "name" : "test8", "count" : 8 }
{ "_id" : 9, "name" : "test9", "count" : 9 }
{ "_id" : 10, "name" : "test10", "count" : 10 }
{ "_id" : 11, "name" : "test11", "count" : 11 }
{ "_id" : 12, "name" : "test12", "count" : 12 }
{ "_id" : 13, "name" : "test13", "count" : 13 }
{ "_id" : 14, "name" : "test14", "count" : 14 }
{ "_id" : 15, "name" : "test15", "count" : 15 }
 
2). update()
db.collection.update( criteria, objNew, upsert, multi )    四個參數的說明以下:
criteria: update的查詢條件,相似sql update查詢內where後面的
objNew: update的對象和一些更新的操做符(如$,$inc...)等,也能夠理解爲sql update查詢內set後面的
upsert: 這個參數的意思是,若是不存在update的記錄,是否插入objNew,true爲插入,默認是false,不插入。
multi: mongodb默認是false,只更新找到的第一條記錄,若是這個參數爲true,就把按條件查出來多條記錄所有更新。
幾個查詢例子以下:
db.mytest.update({count:{$gt:1}},{$set:{name:"ok"}})                                  只更新第一條記錄
db.mytest.update({count:{$gt:3}},{$set:{name:"ok"}},false,true)                  大於3的所有更新了
db.mytest.update({count:{$gt:4}},{$set:{name:"ok123"}},true,false)            只更新了一條
db.mytest.update({count:{$gt:6}},{$set:{name:"ok123"}},true,true)              大於6的所有更新了
 
3). save()
db.collection.save(x) x是要插入的對象,效果與上面的insert命令同樣。save與insert的區別是這樣的:
在進行插入數據的操做中,當遇到_id相同的狀況下,save完成保存操做,insert則會保存;即_id相同狀況下,save至關於更新操做。
 
下面是一些MongoDB的更新操做符
 
4). $inc
用法:{$inc:{field:value}}   意思是對一個數字字段field增長value:
[plain]
> db.mytest.find({_id:1})      
{ "_id" : 1, "name" : "test1", "count" : 1 } 
> db.mytest.update({_id:1},{$inc:{count:1}}) 
> db.mytest.find({_id:1}) 
{ "_id" : 1, "name" : "test1", "count" : 2 }  //count字段加1 
 
value的值也能夠爲負,就至關於減一個值:
[plain]
> db.mytest.update({_id:1},{$inc:{count:-2}}) 
> db.mytest.find({_id:1}) 
{ "_id" : 1, "name" : "test1", "count" : 0 }  //值從2減到0 
 
5). $set命令
用法:{$set:{field:value}}
至關於在關係型 數據庫中sql的set field=value,所有數據類型都支持$set操做
[plain]
> db.mytest.update({_id:1},{$set:{count:111}}) 
> db.mytest.find({_id:1}) 
{ "_id" : 1, "name" : "test1", "count" : 111 }   //修改數值型 
> db.mytest.update({_id:1},{$set:{name:"MongoDB"}}) 
> db.mytest.find({_id:1}) 
{ "_id" : 1, "count" : 111, "name" : "MongoDB" }   //修改字符型 
 
6). $unset
用法:{$unset:{field:1}}
[plain]
> db.mytest.find({_id:1}) 
{ "_id" : 1, "count" : 111, "name" : "MongoDB" } 
> db.mytest.update({_id:1},{$unset:{name:1}}) 
> db.mytest.find({_id:1}) 
{ "_id" : 1, "count" : 111 }  //刪除了字段name 
 
7). $push
用法:{$push:{field:value}}
把value追加到field中取,field必定是數據類型才行,若是field不存在,會新增一個數組類型加進去:
[plain]
> db.mytest.update({_id:15},{$set:{array:["aaa","bbb"]}}) 
> db.mytest.find({_id:15}) 
{ "_id" : 15, "array" : [  "aaa",  "bbb" ], "count" : 15, "name" : "ok123" } 
使用push追加數據:
[plain]
> db.mytest.update({_id:15},{$push:{array:"ccc"}}) 
> db.mytest.find({_id:15}) 
{ "_id" : 15, "array" : [  "aaa",  "bbb",  "ccc" ], "count" : 15, "name" : "ok123" } 
push一次只能追加一個值,若是須要追加多個值,則須要使用$pushAll:
[plain]
> db.mytest.update({_id:15},{$pushAll:{array:["ddd","eee","fff"]}}) 
> db.mytest.find({_id:15}) 
{ "_id" : 15, "array" : [  "aaa",  "bbb",  "ccc",  "ddd",  "eee",  "fff" ], "count" : 15, "name" : "ok123" } 
 
8). $addToSet
用法:{$addToSet:{field:value}}
增長一個值到數組內,並且只有當這個值不在數組內才增長:
[plain]
> db.mytest.update({_id:15},{$addToSet:{array:"123"}}) 
> db.mytest.find({_id:15}) 
{ "_id" : 15, "array" : [  "aaa",  "bbb",  "123" ], "array2" : [  "mmm",  "nnn"], "count" : 15, "name" : "ok123" } 
> db.mytest.update({_id:15},{$addToSet:{array:"aaa"}}) 
> db.mytest.find({_id:15}) 
{ "_id" : 15, "array" : [  "aaa",  "bbb",  "123" ], "array2" : [  "mmm",  "nnn"], "count" : 15, "name" : "ok123" } 
 
9). $pop
刪除數組內的一個值,刪除最後一個值:{$pop:{field:1}} ,刪除第一個值:{$pop:{field:-1}}
[plain]
> db.mytest.find({_id:15}) 
{ "_id" : 15, "array" : [  "aaa",  "bbb",  "123" ], "array2" : [  "mmm",  "nnn"], "count" : 15, "name" : "ok123" } 
> db.mytest.update({_id:15},{$pop:{array:1}}) 
> db.mytest.find({_id:15}) 
{ "_id" : 15, "array" : [  "aaa",  "bbb" ], "array2" : [  "mmm",  "nnn" ], "count" : 15, "name" : "ok123" } 
 
10). $pull
用法:$pull:{field:value}   從數組中刪除一個等於value的值:
[plain]
> db.mytest.find({_id:15}) 
{ "_id" : 15, "array" : [  "aaa",  "bbb" ], "array2" : [  "mmm",  "nnn" ], "coun 
t" : 15, "name" : "ok123" } 
> db.mytest.update({_id:15},{$pull:{array:"aaa"}}) 
> db.mytest.find({_id:15}) 
{ "_id" : 15, "array" : [  "bbb" ], "array2" : [  "mmm",  "nnn" ], "count" : 15, 
"name" : "ok123" } 
 
11). $pullAll
用法同$pull,能夠一次刪除數組內的多個值:
[plain]
> db.mytest.find({_id:15}) 
{ "_id" : 15, "array" : [  "bbb" ], "array2" : [  "mmm",  "nnn" ], "count" : 15,"name" : "ok123" } 
> db.mytest.update({_id:15},{$pullAll:{array2:["mmm","nnn"]}}) 
> db.mytest.find({_id:15}) 
{ "_id" : 15, "array" : [  "bbb" ], "array2" : [ ], "count" : 15, "name" : "ok123" } 
 
12). $
能夠理解爲數組定位器,看一個官方文檔的例子:
[plain]
> t.find() 
{ "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC", "comments" : [ { "by" : "joe", "votes" : 3 }, { "by" : "jane", "votes" : 7 } ] } 
> t.update( {'comments.by':'joe'}, {$inc:{'comments.$.votes':1}}) 
> t.find() 
{ "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC", "comments" : [ { "by" : "joe", "votes" : 4 }, { "by" : "jane", "votes" : 7 } ] } 
須要注意的是,$只會找到第一條數組項,後面的就無論了:
[plain]
> db.mytest.find({_id:16}) 
{ "_id" : 16, "x" : [  1,  2,  3,  1 ] } 
> db.mytest.update({x:1},{$inc:{"x.$":1}}) 
> db.mytest.find({_id:16}) 
{ "_id" : 16, "x" : [  2,  2,  3,  1 ] } 
 
還有一點須要注意,當$配合$unset使用的時候,會留下一個null的數組項,這個問題可使用{$pull:{x:null}}解決:
[plain]
> db.mytest.find({_id:16}) 
{ "_id" : 16, "x" : [  2,  2,  3,  1 ] } 
> db.mytest.update({x:3},{$unset:{"x.$":1}}) 
> db.mytest.find({_id:16}) 
{ "_id" : 16, "x" : [  2,  2,  null,  1 ] } 
> db.mytest.update({_id:16},{$pull:{x:null}}) 
> db.mytest.find({_id:16}) 
{ "_id" : 16, "x" : [  2,  2,  1 ] } 
相關文章
相關標籤/搜索