2014-08-29 mongodb
$inc 構文と upsert 併用すれば簡単。
// 1回目は insert visit_count++ > db.user.update( {user_id: "mgng"}, { $set: { user_id: "mgng", updated: new Date() }, $inc: {visit_count: 1} }, { upsert: true } ); > db.user.find( { user_id: "mgng" }, { visit_count: true } ); { "_id" : ObjectId("53ffd435c7d54aab343e385a"), "visit_count" : 1 } // 2回目は update で visit_count++ > db.user.update( {user_id: "mgng"}, { $set: { user_id: "mgng", updated: new Date() }, $inc: {visit_count: 1} }, { upsert: true } ); > db.user.find( { user_id: "mgng" }, { visit_count: true } ); { "_id" : ObjectId("53ffd435c7d54aab343e385a"), "visit_count" : 2 }
最初は $setOnInsert 使って律儀に初期値をいれようとしてたんだけど、エラーが発生してダメだった。
> db.user.update( {user_id: "mgng"}, { $setOnInsert: { user_id: "mgng", visit_count: 1 }, $set: { updated: new Date() }, $inc: {visit_count: 1} }, { upsert: true } ); WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0, "writeError" : { "code" : 16836, "errmsg" : "Cannot update 'visit_count' and 'visit_count' at the same time" } })