Pymongo如何正确使用$ push来更新现有文档

时间:2012-08-04 15:13:21

标签: pymongo

我做错了什么或者我不理解$ 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,那么将使用boulder替换denver。

感谢您的帮助。

2 个答案:

答案 0 :(得分:12)

$push在这种情况下不起作用,因为您试图在对象上使用数组函数。

要使用$push,您需要将数据结构更改为以下内容:

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

然后你的查询将是:

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

答案 1 :(得分:7)

此查询有效。

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