如何将MongoDB中的属性从文本类型转换为日期类型?

如何将MongoDB中的属性从文本类型转换为日期类型?,mongodb,Mongodb,在MongoDB中,我有一个名为“ClockInTime”的文档,它是作为字符串从CSV导入的 要将这些基于文本的值转换为日期数据类型,适当的db.ClockTime.update()语句是什么样子的?此代码应执行以下操作: > var cursor = db.ClockTime.find() > while (cursor.hasNext()) { ... var doc = cursor.next(); ... db.ClockTime.update({_id : doc._id

在MongoDB中,我有一个名为
“ClockInTime”
的文档,它是作为字符串从CSV导入的


要将这些基于文本的值转换为日期数据类型,适当的
db.ClockTime.update()语句是什么样子的?

此代码应执行以下操作:

> var cursor = db.ClockTime.find()
> while (cursor.hasNext()) {
... var doc = cursor.next();
... db.ClockTime.update({_id : doc._id}, {$set : {ClockInTime : new Date(doc.ClockInTime)}})
... }

我的处境和杰夫·弗里茨完全一样

就我而言,我成功地采用了以下更简单的解决方案:

db.ClockTime.find().forEach(function(doc) { 
    doc.ClockInTime=new Date(doc.ClockInTime);
    db.ClockTime.save(doc); 
    })

如果需要检查字段是否已转换,可以使用以下条件:

/usr/bin/mongo mydb --eval 'db.mycollection.find().forEach(function(doc){
    if (doc.date instanceof Date !== true) {
        doc.date = new ISODate(doc.date);
        db.mycollection.save(doc);
    }
});'

否则命令行可能会中断。

这是python中使用pymongo的通用示例代码

from pymongo import MongoClient
from datetime import datetime

def fixTime(host, port, database, collection, attr, date_format):
    #host is where the mongodb is hosted eg: "localhost"
    #port is the mongodb port eg: 27017
    #database is the name of database eg : "test"
    #collection is the name of collection eg : "test_collection"
    #attr is the column name which needs to be modified
    #date_format is the format of the string eg : "%Y-%m-%d %H:%M:%S.%f"
    #http://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior
    client = MongoClient(host, port)
    db = client[database]
    col = db[collection]
    for obj in col.find():
        if obj[attr]:
            if type(obj[attr]) is not datetime:
                time = datetime.strptime(obj[attr],date_format)
                col.update({'_id':obj['_id']},{'$set':{attr : time}})

有关更多信息:

启动
mongo4.x

  • 可以接受聚合管道,最终允许根据字段的当前值更新字段(
    mongo4.2+
  • 有一个新的聚合运算符(
    mongo4.0
以便:

// { a: "2018-03-03" }
db.collection.update(
  {},
  [{ $set: { a: { $toDate: "$a" } } }],
  { multi: true }
)
// { a: ISODate("2018-03-03T00:00:00Z") }
  • 第一部分是匹配查询,过滤要更新的文档(在本例中为所有文档)

  • 第二部分是更新聚合管道(注意方括号表示使用聚合管道)。是一个新的聚合运算符,在本例中,它将替换字段的值。替换的值是与
    ISODate
    对象一致的字段本身。请注意,
    a
    是如何根据其自身的值(
    $a
    )直接修改的

  • 不要忘记
    {multi:true}
    ,否则只会更新第一个匹配的文档。或者,也可以使用
    updateMany
    代替
    update
    db.collection.updateMany(…)


我想在Mongo shell中执行此语句作为就地更新。如果能看到一些示例数据,例如“时钟时间”,我会很高兴的:-233744483733“@Kristina-呸,这节省了我大量的时间,感谢作者提出了这样的问题。作为旁注(我将被更正)但是,如果要从时间戳值转换,字符串将不起作用。它必须是长整数。例如,时间戳值206281199529不能是源文件(CSV或JSON)中的“206281199529”。我不确定为什么不-在v2.2.2中试用过,每次它都将日期设置为epoch。@Crungmungus这是真的,只有日期构造函数采用的格式的日期才能正确转换。有关所有格式,请参见。@kristina我有一个字符串格式的日期“2003-10-24”。我使用了上述代码,但所有日期都改为1970-01-01。。。。如何使用更新函数?@Shubham你必须有一个有效的JavaScript日期格式,请检查。这是最好的答案(实际上是唯一正确的答案),并且没有投票权:O你也可以使用
updateMany
db.collection.updateMany({},[{$set:{a:{$toDate:$a}}})
这是一个救生解决方案。。。直到我自己试过,我才相信它会起作用。