Литература:
Все еще довольно новый для 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"));
Это в значительной степени сжимает весь объект... Я могу попробовать просто изменить исходный объект формы, а затем запустить обновление. Но до тех пор, может ли кто-нибудь обновить только отдельные поля (а не весь документ)?
EDIT:
Я только что попробовал и смог успешно обновить, отправив весь объект через новые и/или обновленные поля, и это работает. Интересно, достаточно ли водитель достаточно умный, чтобы обновлять только самые маленькие подмножества изменений или просто слепо обновлять всю вещь? (В приведенном ниже примере это просто обновление поля 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 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