Обновление / вставка поддокумента mongodb

Я явно не понимаю, как я обновляю / вставляю вложенный документ в существующий документ. Я попробовал следующее:

        query = aCollection.find_one({stuffToFind})
        aCollection.update(query,
                      {"$set": {"subDoc" : {"1" : String, "2" : datetime.datetime.now(), "3" : otherString}}})

это работает только один раз, но я хочу постоянно изменять Данные 1,2 и 3 субдока, если этот код выполняется. find_and_modify также завершается ошибкой, потому что кажется, что он перезаписывает весь документ, удаляя все остальные поля, кроме идентификатора и полей, указанных в update. Поскольку я довольно новичок в MongoDB, было бы неплохо, если бы кто-нибудь дал мне пример кода, как разобраться в моей проблеме.

Редактировать: без оператора "$set" он остается неизменным и при втором выполнении.

Edit2: это похоже на работу, даже если я больше не могу редактировать затронутый (JSON) документ непосредственно в MonjaDB:D

aCollection.update(query(but this time not as a variable),
                      {"$set" : {"subDoc.1" : Sting, "subDoc.2" : datetime.datetime.now(), "subDoc.3" : otherString}})

Я не знаю, почему это работает, так что, возможно, кто-то может объяснить, что я сделал не так..

Заранее спасибо,

Codehai

1 ответ

Решение

Запрос, который вы предоставляете для обновления в первом примере, является неправильным, вместо:

query = aCollection.find_one({stuffToFind})

у тебя должно быть:

query = {stuffToFind}

Причина, по которой обновление не выдает ошибку, состоит в том, что результат find_one это словарь Также обратите внимание, что иногда вышеприведенное будет работать, поскольку в обновлении вы фактически запрашиваете MongoDB, чтобы он соответствовал всему документу, соответствующему начальному запросу. Последующее использование запроса в этом случае, конечно, не принесет ожидаемых результатов, так как документ будет изменен после обновления.

$ Set обновляет только те ключи, которые мы указали, оставляя все остальное нетронутым. Это означает, что если мы обновим встроенный объект, тогда весь встроенный объект будет заменен тем, что мы указали в $set. Если мы хотим точно определить ключи во встроенном объекте, мы должны использовать точечную нотацию, как во втором примере.

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