Mongodbデータ更新コマンド、オペレータ


一、Mongodbデータ更新コマンド
Mongodb更新には、update、saveの2つのコマンドがあります.
1.1 updateコマンド
updateコマンドフォーマット:
db.collection.update(criteria,objNew,upsert,multi)
パラメータの説明:
criteria:クエリー条件
objNew:updateオブジェクトといくつかの更新オペレータ
upsert:updateのレコードが存在しない場合、objNewという新しいドキュメントを挿入するかどうか、trueは挿入、デフォルトはfalse、挿入しません.
Multi:デフォルトはfalseで、見つかった最初のレコードのみが更新されます.trueの場合は、条件に従ってクエリーされたレコードをすべて更新します.
 
例:
> db.classes.insert({"name":"c1","count":30})
> db.classes.insert({"name":"c2","count":30})
> db.classes.find()
{ "_id" : ObjectId("5030f3a3721e16c4ab180cd9"), "name" : "c1", "count" : 30 }
{ "_id" : ObjectId("5030f3ab721e16c4ab180cda"), "name" : "c2", "count" : 30 }
> 

例1:countが20より大きいclass nameをc 3に変更する
> db.classes.update({"count":{$gt:20}},{$set:{"name":"c3"}})
> db.classes.find()
{ "_id" : ObjectId("5030f3a3721e16c4ab180cd9"), "name" : "c3", "count" : 30 }
{ "_id" : ObjectId("5030f3ab721e16c4ab180cda"), "name" : "c2", "count" : 30 }
> 

upsertとmultiの値は指定されていないため、すべてfalseとデフォルトで設定されており、結果から、最初の条件に合致するレコードのみが変更されていることがわかります.
例2:countが20より大きいclass nameをc 4に変更し、multiをtrueに設定
> db.classes.update({"count":{$gt:20}},{$set:{"name":"c4"}},false,true)
> db.classes.find()
{ "_id" : ObjectId("5030f3a3721e16c4ab180cd9"), "name" : "c4", "count" : 30 }
{ "_id" : ObjectId("5030f3ab721e16c4ab180cda"), "name" : "c4", "count" : 30 }
> 

Multiがtrueに指定されているため、条件に合致する2つのレコードを更新しました.
例3:countが50より大きいclass nameをc 5に変更し、upsertをtrueに設定
> db.classes.update({"count":{$gt:50}},{$set:{"name":"c5"}},true,false)
> db.classes.find()
{ "_id" : ObjectId("5030f3a3721e16c4ab180cd9"), "name" : "c4", "count" : 30 }
{ "_id" : ObjectId("5030f3ab721e16c4ab180cda"), "name" : "c4", "count" : 30 }
{ "_id" : ObjectId("5030f589ce8fa8884e6cd441"), "name" : "c5" }
> 

コレクションにはcountが50より大きいレコードはありませんが、upsertがtrueと指定されているため、見つからない場合は新しいレコードが挿入されます.
1.2 saveコマンド
Mongodbのもう一つの更新コマンドはsaveで、フォーマットは以下の通りです.
db.collection.save(obj)
objは更新が必要なオブジェクトを表し、集合内にobjと同じ「_id」のレコードがすでに存在する場合、Mongodbは集合内に存在するレコードをobjオブジェクトに置き換え、存在しない場合はobjオブジェクトを挿入します.
このコマンドは比較的簡単で、例は省略します.
 
二、データ更新オペレータ
1.$inc
使用法:{$inc:{field:value}}
≪アクション|Actions|ldap≫:数値フィールドのfieldにvalueを追加します.
例:nameをchenzhouとする学生のageを5増加する
> db.students.find()
{ "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "name" : "chenzhou", "age" : 22 }
#         22
> db.students.update({name:"chenzhou"},{$inc:{age:5}})
#    , age  5
> db.students.find()
{ "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "name" : "chenzhou", "age" : 27 }
> 
#         27,    

2.$set
使用法:{$set:{field:value}}
役割:ドキュメント内のフィールドfieldの値をvalueに設定
例:chenzhouの年齢を23歳とする
> db.students.find()
{ "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "name" : "chenzhou", "age" : 27 }
> db.students.update({name:"chenzhou"},{$set:{age:23}})
> db.students.find()
{ "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "name" : "chenzhou", "age" : 23 }
> 

結果を見ると、更新後の年齢は27歳から23歳になりました
3.$unset
使用法:{$unset:{field:1}}
役割:フィールドfieldを削除する
例:chenzhouの年齢フィールドを削除する
> db.students.find()
{ "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "name" : "chenzhou", "age" : 23 }
> db.students.update({name:"chenzhou"},{$unset:{age:1}})
> db.students.find()
{ "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "name" : "chenzhou" }
> 

4.$push
使用法:{$push:{field:value}}
役割:valueをfieldに追加します.注意:fieldは配列タイプのみです.fieldが存在しない場合は、配列タイプが自動的に挿入されます.
例:chenzhouに別名「michael」を追加する
> db.students.find()
{ "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "name" : "chenzhou" }
> db.students.update({name:"chenzhou"},{$push:{"ailas":"Michael"}})
> db.students.find()
{ "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "Michael" ], "name" : "chenzhou" }
> 

その結果、レコードには配列タイプフィールドaliasが追加され、フィールドには「Michael」の値が追加されていることがわかります.
5.pushAll
使用法:{$pushAll:{field:value_array}}
役割:使用方法は$pushと同じですが、$pushAllは一度に複数の値を1つの配列フィールドに追加できます.
例:chenzhouに別名A 1,A 2を追加
 
> db.students.find()
{ "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "Michael" ], "name" : "chenzhou" }
> db.students.update({name:"chenzhou"},{$pushAll:{"ailas":["A1","A2"]}})
> db.students.find()
{ "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "Michael", "A1", "A2" ], "name" : "chenzhou" }
> 

6.$addToSet
使用法:{$addToSet:{field:value}}
役割:配列に値を追加し、この値が配列に存在しない場合にのみ増加します.
例:chenzhouの別名フィールドに2つの別名A 3,A 4を追加する
> db.students.find()
{ "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "Michael", "A1", "A2" ], "name" : "chenzhou" }
> db.students.update({name:"chenzhou"},{$addToSet:{"ailas":["A3","A4"]}})
> db.students.find()
{ "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "Michael", "A1", "A2", [ "A3", "A4" ] ], "name" : "chenzhou" }
> 

その結果、更新後のailasフィールドには、A 3、A 4の2つのデータが含まれているオブジェクトが1つ増えていることがわかります.
7.$pop
使用法:配列内の最初の値を削除する:{$pop:{field:-1}}、配列内の最後の値を削除する:{$pop:{field:1}}
≪アクション|Action|ldap≫:配列内の値を削除します.
例:chenzhouレコードのaliasフィールドの最初の別名を削除する
> db.students.find()
{ "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "Michael", "A1", "A2", [ "A3", "A4" ] ], "name" : "chenzhou" }
> db.students.update({name:"chenzhou"},{$pop:{"ailas":-1}})
> db.students.find()
{ "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "A1", "A2", [ "A3", "A4" ] ], "name" : "chenzhou" }
> 

結果的に本を読むことができ、最初の別名マイケルは削除されました.
コマンドを使用して、最後の別名を削除します.
> db.students.find()
{ "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "A1", "A2", [ "A3", "A4" ] ], "name" : "chenzhou" }
> db.students.update({name:"chenzhou"},{$pop:{"ailas":1}})
> db.students.find()
{ "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "A1", "A2" ], "name" : "chenzhou" }
> 

その結果、aliasフィールドの最後の別名["A 3","A 4"]が削除されたことがわかります.
8.$pull
使用法:{$pull:{field:_value}}
役割:配列fieldから等しいものを削除します.valueの値
例:chenzhouレコードの別名A 1を削除する
> db.students.find()
{ "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "A1", "A2" ], "name" : "chenzhou" }
> db.students.update({name:"chenzhou"},{$pull:{"ailas":"A1"}})
> db.students.find()
{ "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "A2" ], "name" : "chenzhou" }
> 

9.$pullAll
使用法:{$pullAll:value_array}
役割:$pullと同様に、配列内の複数の値を一度に削除できます.
例:chenzhouレコード内のすべての別名を削除する
> db.students.find()
{ "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "A1", "A2" ], "name" : "chenzhou" }
> db.students.update({name:"chenzhou"},{$pullAll:{"ailas":["A1","A2"]}})
> db.students.find()
{ "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ ], "name" : "chenzhou" }
> 

A 1とA 2はすべて削除されていることがわかります
10.$rename
使用法:{$rename:{old_field_name:new_field_name}}
≪アクション|Action|ldap≫:フィールドの名前を変更します.
例:chenzhouレコードのnameフィールドの名前をsnameに変更する
> db.students.find()
{ "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ ], "name" : "chenzhou" }
> db.students.update({name:"chenzhou"},{$rename:{"name":"sname"}})
> db.students.find()
{ "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ ], "sname" : "chenzhou" }
> 

結果からnameフィールドがsnameに更新されたことがわかります.