2012-06-08 41 views
15

¿Hay una manera de convertir la serie hasta la fecha utilizando el formato personalizado utilizando la cáscara mongodbla conversión de la cadena hasta la fecha en mongodb

Estoy tratando de convertir "21/mayo/2012: 16: 35: 33 -0400" hasta la fecha ,

¿Hay alguna manera de pasar DateFormatter o algo así como Date.parse(...) o ISODate(....) método?

+0

http: // developwithstyle. com/articles/2010/07/09/handling-dates-in-mongodb /, no es exactamente lo que quiere, pero todavía puede echar un vistazo –

+0

http://stackoverflow.com/questions/2900674/how-do-i- convert-a-property-in-mongodb-from-text-to-date-type, también mira en este –

Respuesta

4

Puede utilizar el javascript en el segundo enlace proporcionado por Ravi Khakhkhar o tendrá que realizar alguna manipulación de cadena para convertir su cadena original (ya que algunos de los caracteres especiales en su formato original no se reconocen como delimitadores válidos), pero una vez que se hace eso, se pueden utilizar "nueva"

training:PRIMARY> Date() 
Fri Jun 08 2012 13:53:03 GMT+0100 (IST) 
training:PRIMARY> new Date() 
ISODate("2012-06-08T12:53:06.831Z") 

training:PRIMARY> var start = new Date("21/May/2012:16:35:33 -0400")  => doesn't work 
training:PRIMARY> start 
ISODate("0NaN-NaN-NaNTNaN:NaN:NaNZ") 

training:PRIMARY> var start = new Date("21 May 2012:16:35:33 -0400")  => doesn't work  
training:PRIMARY> start 
ISODate("0NaN-NaN-NaNTNaN:NaN:NaNZ") 

training:PRIMARY> var start = new Date("21 May 2012 16:35:33 -0400")  => works 
training:PRIMARY> start 
ISODate("2012-05-21T20:35:33Z") 

Aquí hay algunos enlaces que pueden ser de utilidad (respecto de la modificación de los datos dentro de la consola mongo) -

http://cookbook.mongodb.org/patterns/date_range/

http://www.mongodb.org/display/DOCS/Dates

http://www.mongodb.org/display/DOCS/Overview+-+The+MongoDB+Interactive+Shell

+1

Gracias. Recargué los datos con un cliente externo - http://stackoverflow.com/questions/6154594/how-do-you-store-a-string-in-mongodb-as-a-date-type-using-ruby?rq= 1 – user883257

+1

Genial, gracias por avisarme. Si crees que mi respuesta fue útil, ¿también puedes votarla por favor? –

27

En mi caso tengo éxito con la siguiente solución para convertir ClockInTime campo de la colección de hora del reloj de String a Date tipo:

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

Utilicé - 'nuevo ISODate (...)' para las cadenas de fechas que tenía, y funcionó perfectamente. Gracias por la sugerencia. – sumitkm

+0

'nueva Fecha (...)' estropeó mis fechas. 'new ISODate (...)' funcionó. Gracias @sumitkm – Tur1ng

+1

No sé por qué, pero este método lleva mucho más tiempo ejecutarlo que algo como var cursor = db.restaurant_review.find(); while (cursor.hasNext()) { var doc = cursor.next(); db.restaurant_review.update ({_ id: doc._id}, {$ set: {date: new ISODate (doc.date)}}) }; – qwerty123

3

que tenía algunas cadenas en el MongoDB Almacenado que tuvo que ser reformateado a un campo dateTime apropiado y válido en el mongodb.

aquí es mi código para el formato de fecha especial: "2014-03-12T09: 14: 19.5303017 + 01: 00"

pero se puede facilmente llevar esta idea y escribir su propia expresión regular para analizar los formatos de fecha :

// format: "2014-03-12T09:14:19.5303017+01:00" 
var myregexp = /(....)-(..)-(..)T(..):(..):(..)\.(.+)([\+-])(..)/; 

db.Product.find().forEach(function(doc) { 
    var matches = myregexp.exec(doc.metadata.insertTime); 

    if myregexp.test(doc.metadata.insertTime)) { 
     var offset = matches[9] * (matches[8] == "+" ? 1 : -1); 
     var hours = matches[4]-(-offset)+1 
     var date = new Date(matches[1], matches[2]-1, matches[3],hours, matches[5], matches[6], matches[7]/10000.0) 
     db.Product.update({_id : doc._id}, {$set : {"metadata.insertTime" : date}}) 
     print("succsessfully updated"); 
    } else { 
     print("not updated"); 
    } 
}) 
8

para hacer la conversión, lo que tendría que recorrer manualmente el cursor devuelto por el método find(), ya sea usando el método forEach() o el método del cursor next() para acceder a los documentos. En el canto del bucle, convertir el campo a un objeto ISODate y luego actualizar el campo usando el operador $set, como en el siguiente ejemplo en el que el campo se llama created_at y actualmente contiene la fecha en formato de cadena:

var cursor = db.collection.find({"created_at": {"$exists": true, "$type": 2 }}); 
while (cursor.hasNext()) { 
    var doc = cursor.next(); 
    db.collection.update(
     {"_id" : doc._id}, 
     {"$set" : {"created_at" : new ISODate(doc.created_at)}} 
    ) 
}; 

Para un mejor rendimiento, especialmente cuando se trata de colecciones grandes, aproveche el Bulk API para realizar actualizaciones masivas ya que enviará las operaciones al servidor en lotes de, por ejemplo, 1000 que le ofrece un mejor rendimiento ya que no está enviando todas las solicitudes a el servidor, solo una vez en cada 1000 solicitudes

Lo siguiente demuestra este enfoque, el primer ejemplo usa la API Bulk disponible en las versiones de MongoDB >= 2.6 and < 3.2.En él se actualiza todos los los documentos de la colección cambiando los created_at campos a los campos de fecha:

var bulk = db.collection.initializeUnorderedBulkOp(), 
    counter = 0; 

db.collection.find({"created_at": {"$exists": true, "$type": 2 }}).forEach(function (doc) { 
    var newDate = new ISODate(doc.created_at); 
    bulk.find({ "_id": doc._id }).updateOne({ 
     "$set": { "created_at": newDate} 
    }); 

    counter++; 
    if (counter % 1000 == 0) { 
     bulk.execute(); // Execute per 1000 operations and re-initialize every 1000 update statements 
     bulk = db.collection.initializeUnorderedBulkOp(); 
    } 
}) 
// Clean up remaining operations in queue 
if (counter % 1000 != 0) { bulk.execute(); } 

El siguiente ejemplo se aplica a la nueva versión MongoDB 3.2 que desde entonces ha deprecated the Bulk API y proporcionó una nueva serie de API utilizando bulkWrite():

var bulkOps = [], 
    cursor = db.collection.find({"created_at": {"$exists": true, "$type": 2 }}); 

cursor.forEach(function (doc) { 
    var newDate = new ISODate(doc.created_at); 
    bulkOps.push(   
     { 
      "updateOne": { 
       "filter": { "_id": doc._id } ,    
       "update": { "$set": { "created_at": newDate } } 
      }   
     }   
    ); 

    if (bulkOps.length === 500) { 
     db.collection.bulkWrite(bulkOps); 
     bulkOps = []; 
    }  
}); 

if (bulkOps.length > 0) db.collection.bulkWrite(bulkOps); 
0

¿Cómo sobre el uso de una biblioteca como momentjs escribiendo un script como el siguiente:

[install_moment.js] 
function get_moment(){ 
    // shim to get UMD module to load as CommonJS 
    var module = {exports:{}}; 

    /* 
    copy your favorite UMD module (i.e. moment.js) here 
    */ 

    return module.exports 
} 
//load the module generator into the stored procedures: 
db.system.js.save({ 
     _id:"get_moment", 
     value: get_moment, 
    }); 

luego cargar la secuencia de comandos en la línea de comandos, así:

> mongo install_moment.js 

Por último, en su próxima sesión mongo, lo utilizan de esta manera:

// LOAD STORED PROCEDURES 
db.loadServerScripts(); 

// GET THE MOMENT MODULE 
var moment = get_moment(); 

// parse a date-time string 
var a = moment("23 Feb 1997 at 3:23 pm","DD MMM YYYY [at] hh:mm a"); 

// reformat the string as you wish: 
a.format("[The] DDD['th day of] YYYY"): //"The 54'th day of 1997" 
Cuestiones relacionadas