読者です 読者をやめる 読者になる 読者になる

MongoDBのUpdate修飾子

MongoDB Python

Modifier operations are performance enhancement techniques useful when updating an existing object in certain ways, such as incrementing a number.

http://www.mongodb.org/display/DOCS/Updates

MongoDBのUpdate修飾子は、上記ページによると3種類あるらしい。

$inc
数値型のfieldをvalueで指定した値だけ増やす。fieldが存在しなければ値をvalueにセットする。
$set
fieldの値をvalueにする。
$push
fieldにvalueを追加する。fieldが存在しなければ要素valueをもつ配列をセットする。すでに存在する要素が配列でなければエラー。

配列からAtomicに要素を削除する$pullも提案されている。次のバージョンから追加されるかもしれない。

これらの修飾子は同時に使える。例。

# -*- coding: utf-8 -*-
from pymongo import DESCENDING
from pymongo.connection import Connection

conn = Connection()
j1 = conn.football.j1

j1.remove({ "name": "Trinita" })
j1.insert({ "name": "Trinita", "prefecture": "Oita", "win": 1 })

#j1.ensure_index([("win", DESCENDING)])

j1.update({ "name": "Trinita" },
          { "$inc":  { "win": 1 },
            "$set":  { "manager": "Chamusca"},
            "$push": { "players": "Fernandinho"},
            })

oita = j1.find_one({"name": "Trinita"})
assert oita["win"] == 2
assert oita["manager"] == "Chamusca"
assert oita["players"][-1] == "Fernandinho"

With modifiers, the field being modified must not be part of an index key.

http://www.mongodb.org/display/DOCS/Updates

とあるのように、修飾子を使ったupdateではインデックスがはってあるフィールドは変更できない。なので、上の例でコメントアウトしてあるensure_indexを有効にすると、$incの操作は失敗する。Pythonクライアントの場合は、例外が発生するわけではなく、ただ単にupdateに失敗し、何事もなかったのように振舞う。