MongoDBでドキュメントの子要素の配列のUPDATE方法
MongoDBでドキュメントの中に配列が格納されている場合、その配列をUPDATEする方法のメモを残します。
前提
以下のようなusersというコレクションがあったとします。
users = { {_id: 111, age: 24, live: "Tokyo", skills:["Linux", "C", "Oracle"]}, {_id: 222, age: 26, live: "Osaka", skills:["Windows", "Java"]}, {_id: 333, age: 22, live: "Okinawa", skills:["iOS", "Swift", "PostgrSQL"]} }
配列の末尾に要素を追加する方法
たとえば、_idが「222」のドキュメントに格納されている「skills」という配列に"MongoDB"という要素を追加する方法は以下のとおりです。
db.users.update( {_id: 222}, {$push: {skills : "MongoDB"}} )
↓結果
{_id: 222, age: 26, live: "Osaka", skills:["Windows", "Java", "MongoDB"]}
追加しようとした要素が既に配列内が存在していた場合、追加しないこともできます。その場合は$push ではなく $addToSetを使います。
たとえば、_idが「333」のドキュメントに格納されている「skills」という配列に"Ruby"という要素を追加してみます。
db.users.update( {_id: 333}, {$addToSet: {skills : "Ruby"}} )
↓結果
{_id: 333, age: 22, live: "Okinawa", skills:["iOS", "Swift", "PostgrSQL", "Ruby"]}
ここでもう一度、addToSetを使って 配列の末尾に"Ruby"を追加しようとしても、要素が重複するため、追加できません。
db.users.update( {_id: 333}, {$addToSet: {skills : "Ruby"}} )
↓結果
{_id: 333, age: 22, live: "Okinawa", skills:["iOS", "Swift", "PostgrSQL", "Ruby"]}
このように、addToSetを使うと、重複を許さないような配列を作ることができます。
配列の末尾/先頭から要素を1つ削除する方法
たとえば、_idが「111」のドキュメントに格納されている「skills」という配列の末尾から要素を1つ削除する方法は以下のとおりです。
db.users.update( {_id: 111}, {$pop: {skills : 1}} )
↓結果
{_id: 111, age: 24, live: "Tokyo", skills:["Linux", "C"]}
末尾ではなく先頭から消したければ、以下のように -1 を指定します。
db.users.update( {_id: 111}, {$pop: {skills : -1}} )
↓結果
{_id: 111, age: 24, live: "Tokyo", skills:["C", "Oracle"]},