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

Bri*_*pio 4 pymongo

我做错了什么或者我不理解$ push(可能不明白).无论如何,我有以下文件:

{ "_id" : ObjectId("501c83051d41c8753e000000"), 
   "node" : "denver", 
   "enc" : { "environment" : "production", "classes" : { "denver" : "" } }, 
   "inherit" : "default" }
Run Code Online (Sandbox Code Playgroud)

我正在努力制作这份文件

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

这是我的更新语句的样子:

col.update({ 'node' : 'denver'}, 
           { '$push': { 'enc.classes' : {'boulder': ''}}},
           True)
Run Code Online (Sandbox Code Playgroud)

我没有收到错误,但文档永远不会更新.如果我将$ push更改为$ set,那么将使用boulder替换denver.

谢谢你的帮助.

Nal*_*lum 12

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

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

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

然后你的查询将是:

col.update(
    {
        'node' : 'denver'
    },
    {
        '$push': {
            'enc.classes' : 'boulder'
        }
    },
    True
)
Run Code Online (Sandbox Code Playgroud)


小智 9

此查询有效.

db.foo.update({"node": "denver"}, {"$set": {"enc.classes.boulder": ""}}
Run Code Online (Sandbox Code Playgroud)

  • 在 PyMongo 3.x 中,“更新”已贬值。您可以使用以下命令执行相同的操作并 $push 到数组: db.foo.update_one({"node": "denver"}, {"$push": {"enc.classes.boulder": ""} } (2认同)