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

时间:2010-05-24 22:06:33

标签: mongodb

在MongoDB中,我有一个文档,其中包含一个名为"ClockInTime"的字段,该字段是从CSV导入的字符串。

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

5 个答案:

答案 0 :(得分:80)

此代码应该这样做:

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

答案 1 :(得分:13)

我与杰夫弗里茨完全一样。

就我而言,我已经成功完成了以下更简单的解决方案:

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

答案 2 :(得分:5)

这是使用pymongo

的python中的通用示例代码
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}})

了解更多信息:http://salilpa.com/home/content/how-convert-property-mongodb-text-date-type-using-pymongo

答案 3 :(得分:1)

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

/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);
    }
});'

否则命令行可能会中断。

答案 4 :(得分:0)

开始Mongo 4.x

  • db.collection.update()可以接受聚合管道,最终允许根据字段的当前值(Mongo 4.2+)更新字段。
  • 有一个新的$toDate聚合运算符(Mongo 4.0)。

如此:

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

  • 第二部分[{ $set: { a: { $toDate: "$a" } } }]是更新聚合管道(请注意方括号表示使用聚合管道)。 $set是一个新的聚合运算符,在这种情况下,它将替换该字段的值。替换的值是字段本身与ISODate对象一致。注意如何a根据其自身的值($a)直接进行修改。

  • 不要忘记{ multi: true },否则只会更新第一个匹配的文档。