mongoDB ドキュメント(レコード)が存在すれば更新してなければ追加する

mongoDB ドキュメント(レコード)が存在すれば更新してなければ追加する

mongoDBで、ドキュメント(レコード)が存在すれば更新してなければ追加する手順を記述してます。「update()」に「{ upsert:true }」を指定することで追加することができます。

環境

  • OS CentOS Stream release 9
  • MongoDB 6.0.2

手順

ドキュメント(レコード)が存在すれば更新してなければ追加するには、「db.コレクション名.update()」に「{ upsert:true }」を使用します。

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

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

> use hoge

> db.foo.find()

[
  {
    _id: ObjectId("63610fd98efd8fe165bf1b24"),
    name: 'itiro',
    age: 10,
    gender: 'm'
  },
  {
    _id: ObjectId("63610ff18efd8fe165bf1b25"),
    name: 'jiro',
    gender: 'm',
    age: 55
  },
  {
    _id: ObjectId("636110088efd8fe165bf1b26"),
    name: 'jiro',
    gender: 'm',
    age: 55
  },
  {
    _id: ObjectId("636110088efd8fe165bf1b27"),
    name: 'saburo',
    age: 30,
    gender: 'm'
  },
  {
    _id: ObjectId("636110088efd8fe165bf1b28"),
    name: 'jiro',
    gender: 'f',
    age: 50
  },
  {
    _id: ObjectId("6361100a8efd8fe165bf1b29"),
    name: 'jiro',
    gender: 'x',
    age: 50
  }
]

プロパティ「name」が存在しない「siro」を追加します。

> db.foo.update( { name:'siro' }, { $set:{ gender:"m",age: 55 } }, { upsert:true } )

{
  acknowledged: true,
  insertedId: ObjectId("6361103e79ade7bbe662a24e"),
  matchedCount: 0,
  modifiedCount: 0,
  upsertedCount: 1
}

追加されていることが確認できます。

> db.foo.find()

[
  <省略>
  {
    _id: ObjectId("6361100a8efd8fe165bf1b29"),
    name: 'jiro',
    gender: 'x',
    age: 50
  },
  {
    _id: ObjectId("6361103e79ade7bbe662a24e"),
    name: 'siro',
    age: 55,
    gender: 'm'
  }
]

存在する「jiro」を指定すると、最初のものだけ更新されます。

>  db.foo.update( { name:'jiro' }, { $set:{ gender:"x",age: 35 } }, { upsert:true } )

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

> db.foo.find()

[
  {
    _id: ObjectId("63610fd98efd8fe165bf1b24"),
    name: 'itiro',
    age: 10,
    gender: 'm'
  },
  {
    _id: ObjectId("63610ff18efd8fe165bf1b25"),
    name: 'jiro',
    gender: 'x',
    age: 35
  },
  {
    _id: ObjectId("636110088efd8fe165bf1b26"),
    name: 'jiro',
    gender: 'm',
    age: 55
  },
  {
    _id: ObjectId("636110088efd8fe165bf1b27"),
    name: 'saburo',
    age: 30,
    gender: 'm'
  },
  {
    _id: ObjectId("636110088efd8fe165bf1b28"),
    name: 'jiro',
    gender: 'f',
    age: 50
  },
  {
    _id: ObjectId("6361100a8efd8fe165bf1b29"),
    name: 'jiro',
    gender: 'x',
    age: 50
  },
  {
    _id: ObjectId("6361103e79ade7bbe662a24e"),
    name: 'siro',
    age: 55,
    gender: 'm'
  }
]

存在したものを全て更新する場合は「multi:true」も指定します。

> db.foo.update( { name:'jiro' }, { $set:{ gender:"x",age: 35 } }, { upsert:true, multi:true } )
{
  acknowledged: true,
  insertedId: null,
  matchedCount: 4,
  modifiedCount: 3,
  upsertedCount: 0
}

> db.foo.find()

[
  {
    _id: ObjectId("63610fd98efd8fe165bf1b24"),
    name: 'itiro',
    age: 10,
    gender: 'm'
  },
  {
    _id: ObjectId("63610ff18efd8fe165bf1b25"),
    name: 'jiro',
    gender: 'x',
    age: 35
  },
  {
    _id: ObjectId("636110088efd8fe165bf1b26"),
    name: 'jiro',
    gender: 'x',
    age: 35
  },
  {
    _id: ObjectId("636110088efd8fe165bf1b27"),
    name: 'saburo',
    age: 30,
    gender: 'm'
  },
  {
    _id: ObjectId("636110088efd8fe165bf1b28"),
    name: 'jiro',
    gender: 'x',
    age: 35
  },
  {
    _id: ObjectId("6361100a8efd8fe165bf1b29"),
    name: 'jiro',
    gender: 'x',
    age: 35
  },
  {
    _id: ObjectId("6361103e79ade7bbe662a24e"),
    name: 'siro',
    age: 55,
    gender: 'm'
  }
]