犬ターネット

MongoDB を使ってユーザの訪問数をカウントする

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"
  }
})

うしおととら再読中

超映画批評で10点未満がついた作品一覧