【问题标题】:How to append a new array of values to an existing array document in mongodb using pymongo?如何使用 pymongo 将新的值数组附加到 mongodb 中的现有数组文档?
【发布时间】: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" : {}
                 }

【问题讨论】:

  • 你所谓的“现有数组文档”根本不是一个数组,而是一个哈希,所以你应该先修复它。

标签: python mongodb python-2.7 mongodb-query pymongo


【解决方案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);这是不允许的。~

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

【讨论】:

    猜你喜欢
    • 2016-01-16
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 2023-01-09
    相关资源
    最近更新 更多