【问题标题】:MongoDB update array of object in pythonMongoDB在python中更新对象数组
【发布时间】:2019-12-29 23:10:37
【问题描述】:

我正在尝试使用对象数组更新 mongodb,但收到错误。 这是我的代码

class DocDetails:
    def __init__(self, _name, _createDate, _updateDate):
        self.name = _name
        self.createDate = _createDate
        self.updateDate = _updateDate

aa = DocDetails("Doc1","01-01-2018","05-01-2018")
bb = DocDetails("Doc2","09-12-2019","20-12-2019")

testArray = []
testArray.append(aa)
testArray.append(bb)
print(testArray[1].name)  #Print Doc2, which is right

targetCollectionName.update(
            {'_id':item['_id']},

            { '$push':{'DocumentDetails': {'$each': testArray}}

             },
            upsert=False
        )

现在我收到编码错误

bson.errors.InvalidDocument: cannot encode object: <__main__.DocDetails object at 0x03F14410>, of type: <class '__main__.DocDetails'>

如何处理?

【问题讨论】:

  • 我认为你应该对数组进行 jsonify 并传递它。
  • 我已经尝试过了,如果我尝试像 json.dumps(testArray) 那样对数组进行 jsonify。它说 DocDetails 类型的对象不是 JSON 可序列化 如果我对每个数组对象进行 jsonify 或使 DocDetails JSON 可序列化,那么数据将作为“字符串数组”而不是“对象数组”上传到 mongodb
  • 是的,您必须手动将其转换为 json 对象。您可以在 DocDetails 类中定义一个函数并为每个对象调用它。根据我对 MongoDB 的理解,它接受 json 字符串作为参数而不是对象。

标签: python arrays mongodb push pymongo


【解决方案1】:

您可以使用内置的 __dict__ attribute 将您的对象转换为 pymongo 会满意的字典:

from pymongo import MongoClient
from bson.json_util import dumps

db = MongoClient()['mydatabase']

class DocDetails:
    def __init__(self, _name, _createDate, _updateDate):
        self.name = _name
        self.createDate = _createDate
        self.updateDate = _updateDate

aa = DocDetails("Doc1","01-01-2018","05-01-2018")
db.mycollection.insert_one(aa.__dict__)

print(dumps(db.mycollection.find_one({}, {'_id': 0}), indent=4))

给予:

{
    "name": "Doc1",
    "createDate": "01-01-2018",
    "updateDate": "05-01-2018"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多