Использованная литература:
Все еще новичок в 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