2010-05-24 11 views
46

En MongoDB, tengo un documento con un campo llamado "ClockInTime" que se importó de CSV como una cadena.¿Cómo convierto una propiedad en MongoDB del tipo de texto a fecha?

¿Qué aspecto tiene una declaración db.ClockTime.update() adecuada para convertir estos valores basados ​​en texto a un tipo de datos de fecha?

+0

me gustaría ejecutar esta declaración en la consola mongo como una actualización en el lugar. –

+1

hubiera sido bueno ver algunos datos de muestra, es decir, "ClockTime": "-233744483733" – backdesk

Respuesta

77

Este código debe hacerlo:

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

Eso funcionó ... thx ... –

+2

@Kristina - Uf, esto me ahorró una tonelada de mi tiempo y gracias al autor por preguntar tales pregunta. –

+1

Solo como una nota al margen (y estoy a punto de corregirlo), pero si está convirtiendo desde un valor de marca de tiempo, una cadena no funcionará. Tiene que ser un largo int. Por ejemplo, un valor de marca de tiempo de 206281199529 no puede ser '206281199529' en el archivo fuente (CSV o JSON). No estoy seguro de por qué no, lo probé con v2.2.2 y cada vez establece la fecha en época. – backdesk

13

Tengo exactamente la misma situación que Jeff Fritz.

En mi caso tengo éxito con la siguiente solución más simple:

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

Si es necesario comprobar si el campo ya se ha convertido usted puede utilizar esta condición:

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

lo contrario, el la línea de comando puede romperse.

5

Este es un ejemplo de código genérico en Python usando 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}}) 

para más información: http://salilpa.com/home/content/how-convert-property-mongodb-text-date-type-using-pymongo

Cuestiones relacionadas