Обновление полей во встроенных документах с помощью драйвера MongoDB Java?

Я пытаюсь выполнить обновление встроенного документа в MongoDB с помощью драйвера Java, но получаю исключение IllegalArgumentException, в котором говорится, что "поля, хранящиеся в БД, не могут иметь в них".

Мой документ имеет структуру:

{
    "_id" : ObjectId("5155d102a47d7b00b7e4bed2"),
    "foo" : {
        "bar" : {
            "name" : "Now"
        }
    }
}

и я хочу выполнить обновление, как это

var query = {_id:ObjectId("5155d102a47d7b00b7e4bed2")};
var update = {"foo.bar.time":new Date()};
var withSet = {$set:update};
db.samples.update(query,withSet);

который из консоли корректно изменяет документ

{
    "_id" : ObjectId("5155d102a47d7b00b7e4bed2"),
    "foo" : {
        "bar" : {
            "name" : "Now",
            "time" : ISODate("2013-03-29T18:02:51.591Z")
        }
    }
}

Попытка сделать то же самое в Java, я не увенчался успехом. Я пробовал это:

BasicDBObject query = new BasicDBObject("_id", new ObjectId("5155d102a47d7b00b7e4bed2"));

BasicDBObject time = new BasicDBObject("time", new Date());
BasicDBObject bar = new BasicDBObject("bar", time);
BasicDBObject foo = new BasicDBObject("foo", bar);
BasicDBObject withSet = new BasicDBObject("$set", foo);

samples.update(query, withSet);

Но это забивает внедренный барный объект, уничтожая имя.

Я также попробовал:

BasicDBObject foo = new BasicDBObject();
foo.append("foo.bar.time", new Date());    
samples.update(query, foo)

Но получите IllegalArgumentException.

Я видел другие выбранные ответы на переполнение стека, которые включают эту точечную запись. Я что-то упускаю? Как правильно обновить поле во встроенном документе?

1 ответ

Решение

В вашем последнем примере $set часть отсутствует, возможно это вызывает проблему. Пытаться

samples.update(
  query,
  new BasicDBObject(
    "$set",
    new BasicDBObject("foo.bar.time", new Date())
));

вместо.

Другие вопросы по тегам