Python 遍历PyMongo光标会抛出无效IDBSON:年份超出范围

Python 遍历PyMongo光标会抛出无效IDBSON:年份超出范围,python,mongodb,mongodb-query,pymongo,Python,Mongodb,Mongodb Query,Pymongo,我使用PyMongo来简单地迭代Mongo集合,但我正在努力处理大型Mongodb日期对象 例如,如果我在一个集合中有一些数据如下所示: "bad_data" : [ { "id" : "id01", "label" : "bad_data", "value" : "exist", "type" : "String",

我使用PyMongo来简单地迭代Mongo集合,但我正在努力处理大型Mongodb日期对象

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

"bad_data" : [ 
            {
                "id" : "id01",
                "label" : "bad_data",
                "value" : "exist",
                "type" : "String",
                "lastModified" : ISODate("2018-06-01T10:04:35.000Z"),
                "expires" : Date(9223372036854775000)
            }
        ]
我会这样做:

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
并获取错误
invalidson:year 292278994超出范围


我有没有办法处理这个奇怪的
Date()
对象而不摔倒?我意识到在Mongodb中有这样的约会是疯狂的,但我对此无能为力,因为这不是我的数据。

PyMongo FAQ中实际上有一个关于这个主题的部分:

PyMongo将BSON datetime值解码为Python的
datetime.datetime
实例。
datetime.datetime
的实例限于
datetime.MINYEAR
(通常为1)和
datetime.MAXYEAR
(通常为9999)之间的年份。一些MongoDB驱动程序(例如PHP驱动程序)可以存储BSON日期时间,其年值远远超出
datetime.datetime
所支持的值

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

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

  • 按日期处理违规行为。虽然可以存储,但它可能不是最初存储它的任何人/任何人的“真实”意图

  • 在代码中添加“日期范围”条件以筛选“超出范围”的日期:

  • 如果在进一步处理中不需要数据,请在投影中省略有问题的日期字段:

    result = db['collection'].find({  }, projection={ 'expires': False })
    for i in result:
      # do something with i
    

  • 当然,
    “expires”
    ,顾名思义,该值的原始意图是一个日期,到了将来它永远不会出现,而该数据的原始作者(很可能是当前编写该数据的代码)并不知道“Python”日期约束。因此,在所有文档中以及任何代码仍在编写的地方“降低”该数字可能是非常安全的。

    我刚刚遇到了同样的问题:

    正如尼尔所提到的,我引用:

    PyMongo将BSON datetime值解码为Python的datetime.datetime实例。datetime.datetime的实例是有限的

    所以在仔细观察我的对象之后,我注意到一些日期对象是这样的:
    0000:12:30T00:00:00

    在我的例子中,最好的方法是在将文档插入集合之前设置验证,因此如果日期为0,则将其设置为1970解决了问题


    谢谢你的帮助。我还找到了一种方法,可以通过调用
    \uu getitem\uuuu
    函数来迭代结果,并跳过返回
    invalidson
    的任何结果。@grinferno-您有没有这种检查的示例?
    result = db['collection'].find({  }, projection={ 'expires': False })
    for i in result:
      # do something with i