首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MongoDB中时间的数据类型是什么?

MongoDB中时间的数据类型是什么?
EN

Stack Overflow用户
提问于 2019-05-21 23:52:22
回答 1查看 2.2K关注 0票数 1

我正在写一个程序,用Python语言将数据从MySQL传输到MongoDB。但是,我无法将时间数据类型转换为MongoDB:- MySQL端有一个示例格式的时间数据字段:'18: 59: 32.521177‘(“小时:分钟:秒:毫秒”)我想问一下MongoDB中上述字段对应的数据类型是什么?如何使用python进行转换?

EN

回答 1

Stack Overflow用户

发布于 2019-05-22 04:05:22

mongodb中没有time类型,只有datetime类型。如果您真的只使用时间,而根本不关心日期组件,我建议将日期组件设置为1-jan-1 (year 1)作为标记。在您的示例中,521177看起来是以微秒为单位的,而不是毫秒,因此它将直接进入python datetime对象:

代码语言:javascript
复制
#  Get your time object from MySQL and extract hour, mins, secs, and microseconds.
#  Then, construct a full datetime with the marker date:
d7 = datetime.datetime(1, 1, 1, 18, 59, 32, 521177)
db.foo.insert({"myDate": d7});

db.foo.find();
{ "_id" : ObjectId("5ce45553283c3282ad1cec34"), "myDate" : ISODate("0001-01-01T18:59:32.521Z") }

请注意,MongoDB datetime的时间分量仅对millis准确。如果您需要捕获micros,则必须将其存储在对等字段中,例如

代码语言:javascript
复制
micros = 521177
d7 = datetime.datetime(1, 1, 1, 18, 59, 32, micros)
db.foo.insert({"myDate": d7, "micros": micros});

或者利用丰富的类型,创建一个小的date+micros结构:

代码语言:javascript
复制
micros = 521177
d7 = datetime.datetime(1, 1, 1, 18, 59, 32, micros)
db.foo.insert({"myDate": {"d":d7, "micros": micros}});

这样,您就可以轻松地携带这两部分数据:

代码语言:javascript
复制
db.foo.findOne({}, {"myDate":1} );
{
    "_id" : ObjectId("5ce457df283c3282c43a79b7"),
    "myDate" : {
        "micros" : 521177,
        "d" : ISODate("0001-01-01T18:59:32.521Z")
    }
}

在任何情况下,您都可以直接在从MongoDB获取的date对象上使用python datetimetimedelta特性。使用1-Jan-1约定,日期差异将始终为零,从而产生时间差异--尽管只对millis准确:

代码语言:javascript
复制
micros = 521177
d7 = datetime.datetime(1, 1, 1, 18, 59, 32, micros)
db.foo.insert({"_id":0, "myDate": {"d":d7, "micros": micros}});
micros += 3780    # jump ahead in time a bit....
d7 = datetime.datetime(1, 1, 1, 18, 59, 32, micros)
db.foo.insert({"_id":1, "myDate": {"d":d7, "micros": micros}});

doc1 = db.foo.find_one({"_id":0});
doc2 = db.foo.find_one({"_id":1});

delta = doc2['myDate']['d'] - doc1['myDate']['d']
print "delta: ", delta

delta:  0:00:00.003000

当然,你可以通过添加micros模1000来获得完全保真度,以获得不属于millis的micros,这些micros已经与日期一起存储:

代码语言:javascript
复制
adj1 = doc1['myDate']['d'] + datetime.timedelta(microseconds=doc1['myDate']['micros'] % 1000)
adj2 = doc2['myDate']['d'] + datetime.timedelta(microseconds=doc2['myDate']['micros'] % 1000)

delta = adj2 - adj1
print "delta: ", delta

delta:  0:00:00.003780

当然,如果您决定使用迷你结构来携带datetime+micros,那么将调用一个函数:

代码语言:javascript
复制
def mdb2py(minidatestruct):
    return minidatestruct['d'] + datetime.timedelta(microseconds=minidatestruct['micros'] % 1000)

adj1 = mdb2py(doc1['myDate'])
adj2 = mdb2py(doc2['myDate'])

delta = adj2 - adj1
print "delta: ", delta

delta:  0:00:00.003780
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56242073

复制
相关文章

相似问题

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