mongoDB 複数のドキュメント(レコード)を一括更新する

mongoDB 複数のドキュメント(レコード)を一括更新する

mongoDBで、複数のドキュメント(レコード)を一括更新する手順を記述してます。「update」はmongo6では非推奨となったため「updateMany」と「updateOne」を使用します。

環境

  • OS CentOS Stream release 9
  • MongoDB 6.0.2

手順

複数のドキュメント(レコード)を一括更新するには、「db.コレクション名.updateMany()」を使用します。

db.コレクション名.updateMany({ プロパティを指定 }, { $set:{ プロパティ : 値 })

実際に、以下のデータベース「hoge」にある「foo」というコレクション(テーブル)のドキュメント(レコード)を一括で更新してみます。

> use hoge

> db.foo.find()

[
  {
    _id: ObjectId("6368bdabcbd6720d0fb92c32"),
    name: 'itiro',
    age: 10,
    gender: 'm'
  },
  {
    _id: ObjectId("6368bdabcbd6720d0fb92c33"),
    name: 'jiro',
    age: 20,
    gender: 'm'
  },
  {
    _id: ObjectId("6368bdabcbd6720d0fb92c34"),
    name: 'saburo',
    age: 30,
    gender: 'm'
  },
  {
    _id: ObjectId("6368bdabcbd6720d0fb92c35"),
    name: 'jiro',
    age: 25,
    gender: 'f'
  },
  {
    _id: ObjectId("6368bdabcbd6720d0fb92c36"),
    name: 'jiro',
    age: 30,
    gender: 'x'
  }
]

プロパティ「name」が「jiro」であるものの「age」を全て「50」に変更します。

> db.foo.updateMany( { name:'jiro' }, { $set:{ age: 50 } } )

{
  acknowledged: true,
  insertedId: null,
  matchedCount: 3,
  modifiedCount: 3,
  upsertedCount: 0
}

変更されていることが確認できます。

> db.foo.find()

[
  {
    _id: ObjectId("6368bdabcbd6720d0fb92c32"),
    name: 'itiro',
    age: 10,
    gender: 'm'
  },
  {
    _id: ObjectId("6368bdabcbd6720d0fb92c33"),
    name: 'jiro',
    age: 50,
    gender: 'm'
  },
  {
    _id: ObjectId("6368bdabcbd6720d0fb92c34"),
    name: 'saburo',
    age: 30,
    gender: 'm'
  },
  {
    _id: ObjectId("6368bdabcbd6720d0fb92c35"),
    name: 'jiro',
    age: 50,
    gender: 'f'
  },
  {
    _id: ObjectId("6368bdabcbd6720d0fb92c36"),
    name: 'jiro',
    age: 50,
    gender: 'x'
  }
]

「updateOne」を使用すると、一番最初に見つかったものだけ更新されます。

> db.foo.updateOne( { name:'jiro' }, { $set:{ age: 55 } } )

{
  acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0
}

> db.foo.find()

[
  {
    _id: ObjectId("6368be3dcbd6720d0fb92c37"),
    name: 'itiro',
    age: 10,
    gender: 'm'
  },
  {
    _id: ObjectId("6368be3dcbd6720d0fb92c38"),
    name: 'jiro',
    age: 55,
    gender: 'm'
  },
  {
    _id: ObjectId("6368be3dcbd6720d0fb92c39"),
    name: 'saburo',
    age: 30,
    gender: 'm'
  },
  {
    _id: ObjectId("6368be3dcbd6720d0fb92c3a"),
    name: 'jiro',
    age: 50,
    gender: 'f'
  },
  {
    _id: ObjectId("6368be3dcbd6720d0fb92c3b"),
    name: 'jiro',
    age: 50,
    gender: 'x'
  }
]

mongoDB5

環境

  • OS Ubuntu 20.04
  • MongoDB 5.0.5

mongoDB5では、「db.コレクション名.update()」に「{ multi:true}」を使用します。

db.コレクション名.update({ プロパティを指定 }, { $set:{ プロパティ : 値 }, { multi:true })

実際に、以下のデータベース「hoge」にある「foo」というコレクション(テーブル)のドキュメント(レコード)を一括で更新してみます。

> use hoge

> db.foo.find()

{ "_id" : ObjectId("61b17ec1cf8b8f769c13688b"), "name" : "itiro", "age" : 10, "gender" : "m" }
{ "_id" : ObjectId("61b17ec5cf8b8f769c13688c"), "name" : "jiro", "age" : 20, "gender" : "m" }
{ "_id" : ObjectId("61b17ec9cf8b8f769c13688d"), "name" : "saburo", "age" : 30, "gender" : "m" }
{ "_id" : ObjectId("61b17ecdcf8b8f769c13688e"), "name" : "jiro", "age" : 25, "gender" : "f" }
{ "_id" : ObjectId("61b17ed0cf8b8f769c13688f"), "name" : "jiro", "age" : 30, "gender" : "x" }

同様に「name」が「jiro」であるものの「age」を全て「50」に変更します。

> db.foo.update( { name:'jiro' }, { $set:{ age: 50 } }, { multi:true } )

WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })

変更されていることが確認できます。

> db.foo.find()

{ "_id" : ObjectId("61b17ec1cf8b8f769c13688b"), "name" : "itiro", "age" : 10, "gender" : "m" }
{ "_id" : ObjectId("61b17ec5cf8b8f769c13688c"), "name" : "jiro", "gender" : "m", "age" : 50 }
{ "_id" : ObjectId("61b17ec9cf8b8f769c13688d"), "name" : "saburo", "age" : 30, "gender" : "m" }
{ "_id" : ObjectId("61b17ecdcf8b8f769c13688e"), "name" : "jiro", "gender" : "f", "age" : 50 }
{ "_id" : ObjectId("61b17ed0cf8b8f769c13688f"), "name" : "jiro", "gender" : "x", "age" : 50 }

「false」を指定した場合、もしくは何も指定しなければ、一番最初に見つかったものだけ更新されます。

> db.foo.update( { name:'jiro' }, { $set:{ age: 55 } }, { multi:false } )

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.foo.find()
{ "_id" : ObjectId("61b17ec1cf8b8f769c13688b"), "name" : "itiro", "age" : 10, "gender" : "m" }
{ "_id" : ObjectId("61b17ec5cf8b8f769c13688c"), "name" : "jiro", "gender" : "m", "age" : 55 }
{ "_id" : ObjectId("61b17ec9cf8b8f769c13688d"), "name" : "saburo", "age" : 30, "gender" : "m" }
{ "_id" : ObjectId("61b17ecdcf8b8f769c13688e"), "name" : "jiro", "gender" : "f", "age" : 50 }
{ "_id" : ObjectId("61b17ed0cf8b8f769c13688f"), "name" : "jiro", "gender" : "x", "age" : 50 }