UTALI

書き溜めておいた技術記事や旅行記のバックアップです。

MongoDBでテーブルにないデータをinsertして、存在する場合は更新だけしたい

MongoDBで取得したデータをinsertで次々と追加しているときに困ったことがありました。

データに重複が生じてしまうのですね。

>db.find({title:"おいしいカレーの作り方"}).count()

結果:重複が生じている

2

この場合は

updateのオプションupsertを使えばよい

これに対してはinsertではなくupdateを使ってあるオプションを指定すればOKです。

Mongoose(Node.js)での例

Data.update({title:_data.title},_data,{upsert:true},(err,result)=>{
 // 処理
})

このとき第一引数に参照したいカラムと対応するデータを指定。そして挿入したいデーターを_dataに指定すれば大丈夫です。mongooseのupdateではオプションをJSON形式で第三引数で指定します。upsertを有効化するにはtrueを指定する必要があります。

upsertによってデータが挿入された場合はresultの中身が以下のようになります。

{ ok: 1,

  nModified: 0,

  n: 1,

  upserted: [ { index: 0, _id: 57fc92c65d64a56e14b9579d } ] }

もしデータが存在して挿入がスキップされ、単純に更新された場合は以下のようになります。

{ ok: 1,
  nModified: 1,
  n: 1}