首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >迭代PyMongo游标抛出InvalidBSON:年份超出范围

迭代PyMongo游标抛出InvalidBSON:年份超出范围
EN

Stack Overflow用户
提问于 2018-11-06 18:10:02
回答 3查看 5K关注 0票数 4

我使用PyMongo来简单地迭代Mongo集合,但是我很难处理大型Mongodb日期对象。

例如,如果我的集合中有一些数据如下所示:

代码语言:javascript
复制
"bad_data" : [ 
            {
                "id" : "id01",
                "label" : "bad_data",
                "value" : "exist",
                "type" : "String",
                "lastModified" : ISODate("2018-06-01T10:04:35.000Z"),
                "expires" : Date(9223372036854775000)
            }
        ]

我会做这样的事情:

代码语言:javascript
复制
from pymongo import MongoClient, database, cursor, collection
client = MongoClient('localhost')
db = client['db1']
db.authenticate('user', 'pass', source='admin')
collection = db['collection']
for i in collection:
    # do something with i

并得到错误InvalidBSON: year 292278994 is out of range

有什么方法可以让我处理这个简陋的Date()对象而不掉下来呢?我意识到在Mongodb中有这样一个约会是疯狂的,但我对此无能为力,因为这不是我的数据。

EN

Stack Overflow用户

回答已采纳

发布于 2018-11-06 20:17:36

实际上,PyMongo常见问题中有一个关于这个主题的部分:

为什么我要将OverflowError解码日期存储在另一种语言的驱动程序中? PyMongo将BSON值解码为Python的datetime.datetime实例。datetime.datetime的实例仅限于datetime.MINYEAR (通常为1)和datetime.MAXYEAR (通常为9999)之间的年份。一些MongoDB驱动程序(例如PHP驱动程序)可以存储BSON日期时间,其年值远远超出datetime.datetime支持的值。

因此,这里的基本约束是datetime.datetime类型,它是为驱动程序从BSON映射而实现的,尽管它可能“荒谬”,但其他语言创建这样一个日期值是有效的。

正如常见问题中所指出的,您的一般解决办法是:

  1. 处理这个冒犯人的约会。虽然储存是有效的,但它可能不是任何人/任何东西最初储存它的“真实”意图。
  2. 将“日期范围”条件添加到代码中,以筛选“超出范围”日期: 结果=db‘’collection‘..find({’.find‘:{ '$gte':datetime.min,'$lte':datetime.max })作为i的结果:#对i做一些事情
  3. 如果在进一步处理中不需要数据,则省略投影中的“违规日期”字段: 结果=db‘’collection‘..find({ },projection={ 'expires':False })作为我的结果:#对i做一些事情

当然,'expires'作为一个名称,意味着该值的最初意图是一个永远不会实现的日期,该数据的原始作者(以及非常可能正在编写该数据的当前代码)不知道"Python“约束。因此,在所有文档中以及任何代码仍在编写的地方“降低”这个数字可能是非常安全的。

票数 6
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53177590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档