首页 > 解决方案 > MongoDB在python中更新对象数组

问题描述

我正在尝试使用对象数组更新 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'>

如何处理?

标签: pythonarraysmongodbpushpymongo

解决方案


您可以使用内置__dict__属性将您的对象转换为 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"
}

推荐阅读