InvalidDocument:无法编码对象:ObjectId('51861bc79bb6550f2b98be23')

Posted

技术标签:

【中文标题】InvalidDocument:无法编码对象:ObjectId(\'51861bc79bb6550f2b98be23\')【英文标题】:InvalidDocument: Cannot encode object: ObjectId('51861bc79bb6550f2b98be23')InvalidDocument:无法编码对象:ObjectId('51861bc79bb6550f2b98be23') 【发布时间】:2013-08-28 03:31:32 【问题描述】:

我已经使用 mongo 一段时间了(使用 python、mongo 2.4.4 64 位、OS X 10.8.2、pymongo 2.5.2、python 2.7.2),我观察到一个奇怪的行为。有时在尝试将文档插入集合时会引发以下异常:

无法编码对象:ObjectId('51861bc79bb6550f2b98be23')

... “/Users/nutrina/www/env_pdf_admin_apache/lib/python2.7/site-packages/pymongo/collection.py”, 第 266 行,在保存返回 self.insert(to_save, 操作, 安全, check_keys, **kwargs) 文件 “/Users/nutrina/www/env_pdf_admin_apache/lib/python2.7/site-packages/pymongo/collection.py”, 第 357 行,插入 continue_on_error,self.__uuid_subtype),安全) 无效文档:无法编码对象: ObjectId('51861bc79bb6550f2b98be23')

我不知道为什么会这样。有没有其他人遇到过这个错误,或者有人知道可能导致它的原因吗?

更新: 我要保存的对象具有以下结构:


   'is_open': true,   // boolean
   'data': 
      'user_id': ObjectId(...), // ObjectId
      'user_type': 1,           // Integer
   

报告了字段 *user_id* 的错误,但我很确定该值是有效的 ObjectId。这是来自另一个集合(用户)的对象(用户)的“_id”。并且大多数情况下,相同值的保存操作都会成功。

谢谢, 杰拉德

【问题讨论】:

您要保存的对象是否还有其他可以分享的内容?它包含什么类型的数据? 看看这里***.com/a/18414699/535962 我已经更新了问题的描述。 @lovesh:我不认为这个问题是相关的。 重提一个老问题:你给ObjectId构造函数什么?它是一个字符串吗?有没有可能里面有一些奇怪的字符,比如尾随的空字符、换行符……? @drevicko:事实证明,实现这一点的 wsgi Web 应用程序的配置是问题所在(我认为 WSGIProcessGroup 和 WSGIApplicationGroup 设置不正确)。我试图保存的文档很好。我在这里找到了相关信息:api.mongodb.org/python/current/examples/…。然而,有一个旧版本的 pymongo 正在运行,而不是上面链接中记录的 2.7。 【参考方案1】:

如果您没有在文档中使用原生类型(字符串、整数、日期、布尔值等),则需要确保其编码正确。如果您没有正确编码非标准数据类型,则无法保证它可以插入 PyMongo。您可能遇到了一个边缘情况,它拒绝将您的新对象构建到 PyMongo 文档中。

PyMongo: Custom Types

【讨论】:

好吧,我确实认为ObjectId 是 pymongo 和 mongodb 本身都支持的原生类型。所以 OP 应该还有其他问题 是的,它是引发异常的标准类型,它是有效的 ObjectId,我很确定我设置的值是有效的。请查看我对问题描述的更新。【参考方案2】:

Python 整数存储为任意精度数字,Mongodb 不支持。您需要先将它们转换为普通的 int64 或字符串对象。

【讨论】:

以上是关于InvalidDocument:无法编码对象:ObjectId('51861bc79bb6550f2b98be23')的主要内容,如果未能解决你的问题,请参考以下文章

InvalidDocument:无法编码对象:ObjectId('51861bc79bb6550f2b98be23')

pymongo - bson.errors.InvalidDocument 只是有时无缘无故地提出

TypeScript:标头/值列表->列出ob对象[关闭]

{__ob__: Observer}怎么拿值?

关于图片无法输出的问题使用ob_clean()

获取对象的意外值[重复]