参考文献:
まだmongo dbにはかなり新しいですが、コレクション内の既存のドキュメントの一部を更新しようとしています...残念ながら、上記のリンクには更新の例がありません。
基本的に、私はできるようにしたいだけです:
- ドキュメントに新しいフィールドを追加する
- ドキュメントの既存のフィールドを新しい値に更新する
これが私のコードです(Grails + Groovy + Java + MongoDB + Javaドライバー):
def shape = mongo.shapes.findOne(new BasicDBObject("data", "http://www.foo.com")); // get the document
mongo.shapes.update(new BasicDBObject("_id", shape._id), new BasicDBObject("isProcessed", 0)); // add a new "isProcessed" field set to 0
mongo.shapes.update(new BasicDBObject("_id", shape._id), new BasicDBObject("data", "http://www.bar.com"));
これにより、オブジェクト全体がかなり破壊されます...元の形状オブジェクトを変更してから、その上で更新を実行してみてください。しかしそれまで、(文書全体ではなく) 個々のフィールドだけを更新した経験のある人はいますか?
編集:
試してみたところ、オブジェクト全体を新しいフィールドや更新されたフィールドで送信することで正常に更新できましたが、それは機能します。ドライバーは変更の最小サブセットのみを更新するほどスマートなのか、それともやみくもに全体を更新しているだけなのか? (以下のケースでは、回線を介して foo フィールドを更新しているだけなのか、それともシェイプ ドキュメント全体を更新しているのか?)
コード:
def shape = mongo.shapes.findOne(); // get the first shape to use as a base
shape.removeField("_id"); // remove the id field
shape.put("foo","bar"); // add a new field "foo"
mongo.shapes.insert(shape); // insert the new shape
def shape2 = mongo.shapes.findOne(new BasicDBObject("foo", "bar")); // get the newly inserted shape (and more importantly, it's id)
shape2.put("foo", "bat"); // update the "foo" field to a new value
mongo.shapes.update(new BasicDBObject("_id", shape2._id), shape2); // update the existing document in mongo