代码之家  ›  专栏  ›  技术社区  ›  Jeff Fritz

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

  •  47
  • Jeff Fritz  · 技术社区  · 15 年前

    在MongoDB中,我有一个带有名为 "ClockInTime" 从csv导入的字符串。

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

    4 回复  |  直到 10 年前
        1
  •  79
  •   kris    15 年前

    此代码应执行以下操作:

    > var cursor = db.ClockTime.find()
    > while (cursor.hasNext()) {
    ... var doc = cursor.next();
    ... db.ClockTime.update({_id : doc._id}, {$set : {ClockInTime : new Date(doc.ClockInTime)}})
    ... }
    
        2
  •  13
  •   Ciges    12 年前

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

    在我的例子中,我成功地使用了以下简单的解决方案:

    db.ClockTime.find().forEach(function(doc) { 
        doc.ClockInTime=new Date(doc.ClockInTime);
        db.ClockTime.save(doc); 
        })
    
        3
  •  5
  •   Salil Panikkaveettil    12 年前

    这是使用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

        4
  •  1
  •   webDEVILopers    12 年前

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

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

    否则,命令行可能会中断。