5

1000から始まるカウンターを作りたいです。

つまり、次のようにmongodbドキュメントをアップサートします

  • ドキュメントが存在しない場合は、値 1000 で作成します
  • ドキュメントが既に存在する場合は、値を +1 増やします

以下は機能しません。

environment_data:PRIMARY> db.test.findAndModify
   ({query:{key:"mycounter"},
     update:{$inc:{value:1}, $set:{value:1000}},
     upsert:true})

Error: findAndModifyFailed failed: {
 "errmsg" : "exception: Cannot update 'value' and 'value' at the same time",
 "code" : 16836,
 "ok" : 0
}

挿入の場合は $set 1000 が必要であるが、更新の場合は $inc 1 が必要であることを upsert に伝える方法はありますか?

4

1 に答える 1

3

1 つのアトミック操作で同じフィールドに対して複数の更新操作を実行することはできません。これには 2 つの更新クエリを発行する必要がありvalueます。フィールドが存在しない場合、新しい値 1000 が設定されます。$exists$incvalue

db.test.findAndModify({
    query: { key: "mycounter", value: { $exists: true, $ne : null } },    
    update: { $inc: { value: 1 } },
    upsert: true
});

db.test.findAndModify({
    query: { key: "mycounter", value: { $exists: false } },    
    update: { $set: { value: 1000 } },
    upsert: true
});
于 2015-04-20T11:38:14.380 に答える