2012-06-08 18 views
15

C'è un modo per convertire stringa in data utilizzando il formato personalizzato usando le coperture MongoDBconversione della stringa fino ad oggi in MongoDB

che sto cercando di convertire i "21/Maggio/2012: 16: 35: 33 -0400" fino ad oggi ,

C'è un modo per passare DateFormatter o qualcosa per Date.parse(...) o ISODate(....) metodo?

+0

http: // developwithstyle. it/articles/2010/07/09/handling-dates-in-mongodb /, non esattamente quello che vuoi ma puoi ancora dare un'occhiata –

+0

http://stackoverflow.com/questions/2900674/how-do-i- convert-a-property-in-mongodb-from-text-to-date-type, anche dare un'occhiata a questo –

risposta

4

È possibile utilizzare il javascript nel secondo collegamento fornito da Ravi Khakhkhar oppure è necessario eseguire alcune manipolazioni di stringhe per convertire la stringa originale (poiché alcuni caratteri speciali nel formato originale non vengono riconosciuti come delimitatori validi) ma una volta fatto questo, è possibile utilizzare "nuovo"

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") 

Ecco alcuni link che si possono trovare utili (per quanto riguarda la modifica dei dati all'interno della shell 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

Grazie. Ho ricaricato i dati con un client esterno: http://stackoverflow.com/questions/6154594/how-do-you-store-a-string-in-mongodb-as-a-date-type-using-ruby?rq= 1 – user883257

+1

Cool, grazie per avermelo fatto notare. Se ritieni che la mia risposta sia stata utile, puoi anche revocarla per favore? –

27

Nel mio caso ho successo con la seguente soluzione per la conversione di campo ClockInTime dalla raccolta ClockTime da stringa a Data Tipo:

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

Ho usato - 'new ISODate (...)' per le stringhe di data che ho avuto, e ha funzionato perfettamente. Grazie per il suggerimento. – sumitkm

+0

'new Date (...)' ha incasinato le mie date. 'new ISODate (...)' ha funzionato. Grazie @sumitkm – Tur1ng

+1

Non so perché, ma questo metodo richiede molto più tempo rispetto a qualcosa come var cursor = db.restaurant_review.find(); while (cursor.hasNext()) { var doc = cursor.next(); db.restaurant_review.update ({_ id: doc._id}, {$ set: {data: new ISODate (doc.date)}}) }; – qwerty123

3

ho avuto alcune stringhe nel MongoDB Memorizzato che dovette essere riformulato in un data time valido e valido nel mongodb.

Ecco il mio codice per il formato data speciale: "2014-03-12T09: 14: 19,5,303017 millions + 01: 00"

ma si può easyly prendere questa idea e scrivere il proprio regex per analizzare i formati di data :

// 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

per eseguire la conversione, si avrebbe bisogno di iterare manualmente il cursore restituito dal metodo find() sia usando il metodo forEach() o il metodo del cursore next() per accedere ai documenti. Withing loop, convertire il campo per un oggetto isodate e quindi aggiornare il campo utilizzando l'operatore $set, come il seguente esempio in cui il campo viene chiamato created_at ricopre attualmente la data in formato stringa:

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

Per migliorare le prestazioni, in particolare quando si gestiscono raccolte di grandi dimensioni, sfruttare lo Bulk API per gli aggiornamenti di massa poiché si invieranno le operazioni al server in batch di 1000, che offre una prestazione migliore in quanto non si inviano tutte le richieste a il server, solo una volta ogni 1000 richieste.

Quanto segue dimostra questo approccio, il primo esempio utilizza l'API Bulk disponibile nelle versioni MongoDB >= 2.6 and < 3.2.Si aggiorna tutti i documenti della collezione cambiando i created_at campi ai campi data:

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(); } 

Il prossimo esempio applica alla nuova MongoDB versione 3.2 che da allora deprecated the Bulk API e ha fornito una serie più recente di apis usando 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

ne dite di usare una libreria come momentjs scrivendo uno script come questo:

[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, 
    }); 

Poi caricare lo script dalla riga di comando in questo modo:

> mongo install_moment.js 

Infine, nella sessione successiva mongo, usarlo in questo modo:

// 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" 
Problemi correlati