如何使用 pymongo 将新的值数组附加到 mongodb 中的现有数组文档?

Posted

技术标签:

【中文标题】如何使用 pymongo 将新的值数组附加到 mongodb 中的现有数组文档?【英文标题】:How to append a new array of values to an existing array document in mongodb using pymongo? 【发布时间】:2020-10-15 23:01:35 【问题描述】:

现有的集合如下:

"_id" : "12345",
"vals" : 
        "dynamickey1" : 

我需要添加

"vals" : 
            "dynamickey2" : 
    

我已经在 python 2.7 和 pymongo 2.8 中尝试过:

col.update('_id': id),'$push': 'vals': "dynamickey2":"values")

错误日志:

pymongo.errors.OperationFailure: The field 'vals' must be an array but is of type object in document

预期输出:

    "_id" : "12345",
        "vals" : 
                "dynamickey1" : ,
                "dynamickey2" : 
                 

【问题讨论】:

你所谓的“现有数组文档”根本不是一个数组,而是一个哈希,所以你应该先修复它。 【参考方案1】:

编辑以下问题编辑:

两个选项;使用带有点符号的 $set,或使用 python dict 操作。

第一种方法更 MongoDB 原生,是一行代码;第二个工作量更大,但如果您的用例更细致入微,则可以提供更多的灵活性。

方法一:

from pymongo import MongoClient
from bson.json_util import dumps

db = MongoClient()['mydatabase']

db.mycollection.insert_one(
    "_id": "12345",
    "vals": 
        "dynamickey1": ,
    
)

db.mycollection.update_one('_id': '12345','$set': 'vals.dynamickey2':)

print(dumps(db.mycollection.find_one(), indent=4))

方法二:

from pymongo import MongoClient
from bson.json_util import dumps

db = MongoClient()['mydatabase']


db.mycollection.insert_one(
    "_id": "12345",
    "vals": 
        "dynamickey1": ,
    
)

record = db.mycollection.find_one('_id': '12345')
vals = record['vals']
vals['dynamickey2'] = 
record = db.mycollection.update_one('_id': record['_id'], '$set': 'vals': vals)

print(dumps(db.mycollection.find_one(), indent=4))

无论哪种方式都给出:


    "_id": "12345",
    "vals": 
        "dynamickey1": ,
        "dynamickey2": 
    

上一个答案

您的预期输出有一个包含重复字段的对象 (vals);这是不允许的。~

所以无论你想做什么,它都行不通。

【讨论】:

以上是关于如何使用 pymongo 将新的值数组附加到 mongodb 中的现有数组文档?的主要内容,如果未能解决你的问题,请参考以下文章

Apache Spark 如何将新列从列表/数组附加到 Spark 数据帧

如何使用 pandas 将新的数据帧行附加到 csv?

如何使用 php 类 DOMDocument 将新的 xml 节点附加到现有的 .xml 文件?

如何将新的 JVM 附加到生成的 Python 进程?

将项目附加到 PyMongo 中的 MongoDB 文档数组而不重新插入

将新的 JavaDoc 附加到来自 super 方法的现有 JavaDoc