2010-05-24 1 views
46

In MongoDB habe ich ein Dokument mit einem Feld namens "ClockInTime", das aus CSV als Zeichenfolge importiert wurde.Wie konvertiere ich eine Eigenschaft in MongoDB von Text nach Datum?

Wie sieht eine entsprechende db.ClockTime.update()-Anweisung aus, um diese textbasierten Werte in einen Datumsdatentyp zu konvertieren?

+0

Ich mag würde diese Aussage in der Mongo Shell als in-Place-Update auszuführen. –

+1

wäre gut, um einige Beispieldaten zu sehen, dh "ClockTime": "-233744483733" – backdesk

Antwort

77

sollte dieser Code es tun:

> 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

Das hat funktioniert ... thx ... –

+2

@Kristina - Puh, das hat eine Menge meiner Zeit gespart und ich danke dem Autor dafür Frage. –

+1

Nur als Randnotiz (und ich werde korrigiert werden), aber wenn Sie von einem Zeitstempel Wert konvertieren, wird eine Zeichenfolge nicht funktionieren. Es muss ein langer int sein. Zum Beispiel kann ein Zeitstempelwert von 206281199529 nicht '206281199529' in der Quelldatei (CSV oder JSON) sein. Ich bin mir nicht sicher, warum nicht - probierte es mit v2.2.2 aus und jedes Mal stellte es das Datum auf Epoche. – backdesk

13

ich genau wie Jeff Fritz die gleiche Situation haben.

In meinem Fall habe ich mit folgenden einfacheren Lösung habe Erfolg:

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

Wenn Sie überprüfen müssen, wenn das Feld bereits umgesetzt wurde, können Sie diese Bedingung verwenden können:

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

Ansonsten ist die Die Befehlszeile kann brechen.

5

Dies ist ein generischer Beispielcode in Python pymongo mit

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

für weitere Informationen: http://salilpa.com/home/content/how-convert-property-mongodb-text-date-type-using-pymongo

Verwandte Themen