2013-07-22 4 views
1

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

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

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

Edit: без «$ набора» заявление остается без изменений, а на втором исполнении ..

Edit2: это, кажется, работает, Eventhough я не могу редактировать пораженную (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}}) 

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

Спасибо dvance,

Codehai

ответ

1

Запрос Вы обеспечиваете обновление в первом примере, не является правильным, вместо:

query = aCollection.find_one({stuffToFind}) 

вы должны иметь:

query = {stuffToFind} 

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

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

+0

спасибо большое за объяснение! – Codehai

Смежные вопросы