代码之家  ›  专栏  ›  技术社区  ›  grinferno

遍历PyMongo游标抛出invalidson:year超出范围

  •  2
  • grinferno  · 技术社区  · 7 年前

    我正在使用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
    

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

    有什么办法我能应付这件事吗 Date()

    1 回复  |  直到 7 年前
        1
  •  6
  •   Neil Lunn    7 年前

    Pymango FAQ中有一个关于这个主题的部分:

    Why do I get OverflowError decoding dates stored by another language’s driver?

    PyMongo将BSON datetime值解码为python实例 datetime.datetime 日期时间。日期时间 限制在 datetime.MINYEAR (通常为1)和 datetime.MAXYEAR 日期时间。日期时间

    所以这里的基本约束是 日期时间。日期时间

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

    1. 在约会时处理不愉快的事。虽然储存是有效的,但它可能不是最初储存它的人/物的“真实”意图。

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

      result = db['collection'].find({ 
        'expires': { '$gte': datetime.min, '$lte': datetime.max }
      })
      for i in result:
        # do something with i
      
    3. 如果在进一步处理中不需要数据,请省略投影中有问题的日期字段:

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

    当然 'expires'

        2
  •  0
  •   napi15    5 年前

    我也有同样的问题:

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

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

    enter image description here