A little bit of everything

情報系大学院生の備忘録

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"]},

参考

docs.mongodb.com