Обновление / вставка поддокумента 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. Если мы хотим точно определить ключи во встроенном объекте, мы должны использовать точечную нотацию, как во втором примере.