Pymongo, как правильно использовать $push для обновления существующего документа

Я делаю что-то не так или не понимаю $push (возможно, не понимаю). В любом случае у меня есть следующий документ:

{ "_id" : ObjectId("501c83051d41c8753e000000"), 
   "node" : "denver", 
   "enc" : { "environment" : "production", "classes" : { "denver" : "" } }, 
   "inherit" : "default" }

И я пытаюсь сделать документ

{ "_id" : ObjectId("501c83051d41c8753e000000"), 
  "node" : "denver", 
  "enc" : { "environment" : "production", 
  "classes" : { "denver" : "", "boulder" : ""} }, 
  "inherit" : "default" }

Вот как выглядит мое обновление:

col.update({ 'node' : 'denver'}, 
           { '$push': { 'enc.classes' : {'boulder': ''}}},
           True)

Я не получаю сообщение об ошибке, но документ никогда не обновляется. Если я изменю $ push на $set, то денвер заменяется на валун.

Спасибо за любую помощь.

2 ответа

Решение

Этот запрос работает.

db.foo.update({"node": "denver"}, {"$set": {"enc.classes.boulder": ""}}

$push в этом случае не работает, потому что вы пытаетесь использовать функцию массива для объекта.

Использовать $push вам нужно изменить структуру данных следующим образом:

{
    "_id" : ObjectId("501c83051d41c8753e000000"), 
    "node" : "denver", 
    "enc" : {
        "environment" : "production", 
        "classes" : [
            "denver"
        ]
    }, 
    "inherit" : "default"
}

Тогда ваш запрос будет:

col.update(
    {
        'node' : 'denver'
    },
    {
        '$push': {
            'enc.classes' : 'boulder'
        }
    },
    True
)
Другие вопросы по тегам