2012-10-10 99 views
8

He creado y quiero ahora importar una colección ficticia. uno de los campos en cada elemento son campos "creados" y "actualizados". ¿Qué puedo poner en el archivo fuente/json para que MongoDb use la fecha y hora actual como el valor en la importación?MongoDb timestamp

esto no trabajará

"created" : Date() 
+0

¿Usted ha intentado 'new Date()'? – udidu

+0

me da un error al analizar el error de cadena JSON cuando intento "new Date()" – Simba

+0

¿A qué se refiere al decir 'source/json file'? – udidu

Respuesta

12

mongoimport está destinado a la importación de datos los datos existentes en formato CSV, TSV, o JSON. Si desea insertar nuevos campos (como una marca de tiempo created), tendrá que establecer un valor para ellos.

Por ejemplo, si desea establecer la fecha y hora created a la hora actual, se puede obtener una marca de tiempo Unix desde la línea de comandos (que será segundos desde la época):

$ date +%s 
1349960286 

El JSON <date> representation que mongoimport espera que sea un entero con signo de 64 bits que represente milisegundos desde la época. Tendrá que multiplicar el valor de los segundos unixtime en 1000 e incluir en su archivo JSON:

{ "created": Date(1349960286000) } 

Un enfoque alternativo sería añadir las marcas de tiempo creados a documentos después de que se han insertado.

Por ejemplo:

db.mycoll.update(
    {created: { $exists : false }}, // Query criteria 
    { $set : { created: new Date() }}, // Add 'created' timestamp 
    false, // upsert 
    true // update all matching documents 
) 
+0

¿Qué pasa si el campo es un ISODate? Me he dado cuenta de que la Fecha (marca de tiempo) produce una cadena, y ISODate (hora del mismo tiempo) produce una fecha completamente diferente e inesperada. ¿Cómo convertir de la cadena al formato ISODate? – Ketema

+4

La función ['ISODate()'] (https://github.com/mongodb/mongo/blob/v2.2/src/mongo/shell/utils.js#L400) es un ayudante conveniente para crear 'Fecha () 'objetos. El constructor 'ISODate()' espera una cadena de fecha/hora de estilo ISO8601, mientras 'Date()' espera un unixtime (segundos desde la época). Si prueba 'new Date()' y 'new ISODate()' en el shell 'mongo', debería ver que ambos producen el mismo valor (un' ISODate'). Ambos formatos tienen la misma [representación BSON] (http://bsonspec.org/#/specification), que es una fecha y hora UTC. – Stennie

3

Como Stennie señaló correctamente, no se puede hacer esto con un solo mongoimport o mongorestore: son sólo para la restauración de su previamente depositados datos. La forma correcta de hacerlo es restaurar los datos y luego actualizar los datos restaurados.

Con un nuevo mongo 2.6 puede hacerlo fácilmente usando la operación $currentDate, que se creó para actualizar la hora a una marca de tiempo actual.

En el caso de que necesite algo así como

db.users.update( 
    {}, 
    { 
    $currentDate: { 
     created: true, 
     updated: true 
    }, 
    } 
)