我使用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()对象而不掉下来呢?我意识到在Mongodb中有这样一个约会是疯狂的,但我对此无能为力,因为这不是我的数据。
发布于 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映射而实现的,尽管它可能“荒谬”,但其他语言创建这样一个日期值是有效的。
正如常见问题中所指出的,您的一般解决办法是:
当然,'expires'作为一个名称,意味着该值的最初意图是一个永远不会实现的日期,该数据的原始作者(以及非常可能正在编写该数据的当前代码)不知道"Python“约束。因此,在所有文档中以及任何代码仍在编写的地方“降低”这个数字可能是非常安全的。
发布于 2022-03-31 15:37:15
对于pymongo查询,我也有过同样的问题。当我试图查询我的数据时,我得到了以下错误:
year 53427 is out of range因为我的一些值是在Unix时的,而有些是在IOS时的。
我的解决方案:
{$addFields: {
Unix_time_index: {$cond:
{ if: { $gt: [ "$mytime", ISODate("2023-12-12T00:00:00.000Z") ] },
then: 1,
else: 0 }},
}},{$addFields:{
mytime: {$cond:
{ if: { $eq: [ "$Unix_time_index", 1 ] },
then: {$toLong: "$mytime"},
else: "$mytime" }},
}},{$addFields:{
mytime: {$cond:
{ if: { $eq: [ "$Unix_time_index", 1 ] },
then: { $divide: [ "$mytime",1000 ] },
else: "$mytime" }},
}},{$addFields:{
mytime: {$cond:
{ if: { $eq: [ "$Unix_time_index", 1 ] },
then: {$toDate: "$mytime"},
else: "$mytime" }}
}},结果:
/* 1 */
{
"_id" : ObjectId("606b5d48ab86b4002130f944"),
"mytime" : ISODate("2021-06-18T21:52:51.000Z"),
"before" : Date(1624053171000000),
"Unix_time_index" : 1.0
}
/* 2 */
{
"_id" : ObjectId("606b5d48ab86b4002130f944"),
"mytime" : ISODate("2021-06-18T21:52:47.000Z"),
"before" : Date(1624053167000000),
"Unix_time_index" : 1.0
}
/* 3 */
{
"_id" : ObjectId("606b5d48ab86b4002130f944"),
"mytime" : ISODate("2022-01-27T23:44:46.000Z"),
"before" : ISODate("2022-01-27T23:44:46.000Z"),
"Unix_time_index" : 0.0
}发布于 2020-12-28 16:34:33
我刚刚也遇到了同样的问题:
正如尼尔提到的,我引用如下:
PyMongo将BSON值解码为Python的datetime.datetime实例。datetime.datetime的实例是有限的
因此,在仔细观察我的对象之后,我注意到一些日期对象如下:0000:12:30T00:00:00
在我的例子中,最好的方法是在将文档插入集合之前设置一个验证,因此如果日期为0,则将其设置为1970解决了这个问题。

https://stackoverflow.com/questions/53177590
复制相似问题