首页 > 解决方案 > $push 追加到 MongoDB 文档

问题描述

我在使用 $push 使用 Pymongo 将新记录附加到 MongoDB Atlas 中的现有文档 ID 时遇到问题。

MongoDB Atlas中现有的集合如下:

{'_id': ObjectId('60d0a244102671b912874753'),
 'entities': [{'uen': '12345678K',
               'name': 'COMPANY A',
               'persons': [{'personId': 'P123456',
                            'personIdType': 'Passport/Others',
                            'personNationality': 'INDIAN',
                            'personName': 'SOME NAME',
                            'personRole': 'OFFICER',
                            'personAddress': {'address1': 'ADDRESS x'}}]}]}

我正在尝试在同一 objectID 下附加属于同一“公司 A”的新人的信息:

{'personId': '34567F',
 'personIdType': 'Passport/Others',
 'personNationality': 'ABC',
 'personName': 'NEW PERSON',
 'personRole': 'OFFICER',
 'personAddress': {'address1': 'ADDRESS y'}}

因此,理想情况下,更新后的集合将如下所示:

{'_id': ObjectId('60d0a244102671b912874753'),
 'entities': [{'uen': '12345678K',
               'name': 'COMPANY A',
               'persons': [{'personId': 'P123456',
                            'personIdType': 'Passport/Others',
                            'personNationality': 'INDIAN',
                            'personName': 'SOME NAME',
                            'personRole': 'OFFICER',
                            'personAddress': {'address1': 'ADDRESS x'}},
                           {'personId': '34567F', # Newly appended information
                            'personIdType': 'Passport/Others',
                            'personNationality': 'ABC',
                            'personName': 'NEW PERSON',
                            'personRole': 'OFFICER',
                            'personAddress': {'address1': 'ADDRESS y'}}]}]}

我使用的代码似乎没有更新任何东西,我不确定为什么:

toPopulate = {'personId': '34567F',
 'personIdType': 'Passport/Others',
 'personNationality': 'ABC',
 'personName': 'NEW PERSON',
 'personRole': 'OFFICER',
 'personAddress': {'address1': 'ADDRESS y'}}

docID = '60d0a244102671b912874753' 
db.my_collection.update_one({'_id': docID},
                                {'$push': {'entities.persons': toPopulate}})

$push 是正确的使用方法吗?如果没有,我还能如何更新我的数据?


更新:采纳user199805的建议后,还是没有更新。但是,这不是语法问题。相反,我意识到 的值docID不包含正确的值。我最初使用

documentId = []
result = db.my_collection.find({'entities.uen': '12345678K'},
                           {'_id': 1}) 
for i in result:
    documentId.append(i)
docID = str(documentId[0]['_id']) 

其中以字符串格式分配了 id '60d0a244102671b912874753'。这无法读取,我通过删除 str() 函数解决了它,或者更确切地说

docID = documentId[0]['_id']

这给了我ObjectId('60d0a244102671b912874753')。将它传递给对 update_one 的调用成功地解决了问题。谢谢user199805。

标签: pythonmongodbpymongo

解决方案


db.collection.update_one(
  {'_id': docID},
  {'$push': {'entities.$[].persons': toPopulate}})

推荐阅读