使用PyMongo更新MongoDB文档

时间:2015-10-18 21:34:14

标签: python mongodb python-3.x pymongo database

我正在尝试更新集合中的文档:

bson.errors.InvalidDocument: Cannot encode object: 0

我正在尝试将新的bookingId添加到此人已有的预订列表中。

我收到以下错误:

for bookerName in BookerNames:
    personRecord = {"Name":bookerName,"Bookings":[1,2,3,4]}
    Person.insert_one(personRecord)

根据我对此错误的理解,这意味着Mongo不知道如何编码列表,它将其视为自定义类型。

然而,这很奇怪,因为我能做到:

for bookerName in bookerNames:
    bookingList = bookersToBookings[bookerName]
    personRecord = {"Name":bookerName,"Bookings":bookingList}
    Person.insert_one(personRecord)

它完美无缺。

我还尝试使用$ set进行更新,甚至删除旧记录并尝试插入带有更新列表的新记录。

知道为什么会这样,或者如何更新文档中的列表?

我使用的是Python 3.5,PyMongo 3.0.3和MongoDB 3.0.7。 PyMongo和MondoDB之间的版本差异可能是问题吗?

编辑:

for bookerName in bookerNames:
    personRecord = {"Name":bookerName,"Bookings":[]}
    Person.insert_one(personRecord)
for x in Person.find():
    print(x)

其中bookersToBookings是一个字典,将预订标记映射到他们的bookingIds,列表。

这不起作用,但如果我用[1,2,3]这样的列表创建记录,它就可以了。

编辑2:

{'Name': 'Alice', '_id': ObjectId('56241ad79e44c71641efa383'), 'Bookings': []}
{'Name': 'John', '_id': ObjectId('56241ad79e44c71641efa384'), 'Bookings': []}
{'Name': 'Jane', '_id': ObjectId('56241ad79e44c71641efa385'), 'Bookings': []}
{'Name': 'Mary', '_id': ObjectId('56241ad79e44c71641efa386'), 'Bookings': []}
{'Name': 'Dan', '_id': ObjectId('56241ad79e44c71641efa387'), 'Bookings': []}

这很有效。它打印:

for bookerName in bookerNames:
    personRecord = {"Name":bookerName,"Bookings":[1,2,3]}
    Person.insert_one(personRecord)

这也有效:

{'Bookings': [1, 2, 3], '_id': ObjectId('56241b029e44c716497b60b2'), 'Name': 'Alice'}
{'Bookings': [1, 2, 3], '_id': ObjectId('56241b029e44c716497b60b3'), 'Name': 'John'}
{'Bookings': [1, 2, 3], '_id': ObjectId('56241b029e44c716497b60b4'), 'Name': 'Jane'}
{'Bookings': [1, 2, 3], '_id': ObjectId('56241b029e44c716497b60b5'), 'Name': 'Mary'}
{'Bookings': [1, 2, 3], '_id': ObjectId('56241b029e44c716497b60b6'), 'Name': 'Dan'}

结果:

for bookerName in bookerNames:
    y = [1,2,3,4]
    personRecord = {"Name":bookerName,"Bookings":[x for x in y]}
    Person.insert_one(personRecord)

即便如此:

{'_id': ObjectId('56241b5a9e44c7165395a0f0'), 'Bookings': [1, 2, 3, 4], 'Name': 'Alice'}
{'_id': ObjectId('56241b5a9e44c7165395a0f1'), 'Bookings': [1, 2, 3, 4], 'Name': 'John'}
{'_id': ObjectId('56241b5a9e44c7165395a0f2'), 'Bookings': [1, 2, 3, 4], 'Name': 'Jane'}
{'_id': ObjectId('56241b5a9e44c7165395a0f3'), 'Bookings': [1, 2, 3, 4], 'Name': 'Mary'}
{'_id': ObjectId('56241b5a9e44c7165395a0f4'), 'Bookings': [1, 2, 3, 4], 'Name': 'Dan'}

结果:

for bookerName in bookerNames:
    y = bookersToBookings[bookerName]
    personRecord = {"Name":bookerName,"Bookings":[x for x in y]}
    Person.insert_one(personRecord)

然而,这不起作用:

{'Mary': [5, 9], 'Jane': [4, 7, 8, 13, 14], 'Alice': [0, 6, 10], 'Dan': [12], 'John': [1, 2, 3, 11]}

bookersToBookings看起来像这样:

{{1}}

编辑3 - 已解决:

$%#^清酒!该列表由numpy64整数组成,而不是python整数。它现在有效。

感谢您的帮助!

0 个答案:

没有答案