Hoe converteer ik een eigenschap in MongoDB van tekst naar datumtype?

In MongoDB heb ik een document met een veld genaamd "ClockInTime"dat als een tekenreeks uit CSV is geïmporteerd.

Hoe ziet een geschikte db.ClockTime.update()-instructie eruit om deze op tekst gebaseerde waarden om te zetten in een datumgegevenstype?


Antwoord 1, autoriteit 100%

Deze code zou het moeten doen:

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

Antwoord 2, autoriteit 17%

Ik heb precies dezelfde situatie als Jeff Fritz.

In mijn geval ben ik geslaagd met de volgende eenvoudigere oplossing:

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

Antwoord 3, autoriteit 6%

Dit is een generieke voorbeeldcode in python die pymongo gebruikt

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

voor meer info: http: //salilpa.com/home/content/how-convert-property-mongodb-text-date-type-using-pymongo


Antwoord 4, autoriteit 2%

Vanaf Mongo 4.x:

  • db.collection.update()kan een aggregatiepijplijn accepteren, waardoor het eindelijk mogelijk is een veld bij te werken op basis van de huidige waarde (Mongo 4.2+).
  • Er is een nieuwe $toDateaggregatie-operator (Mongo 4.0).

Zodat:

// { a: "2018-03-03" }
db.collection.update(
  {},
  [{ $set: { a: { $toDate: "$a" } } }],
  { multi: true }
)
// { a: ISODate("2018-03-03T00:00:00Z") }
  • Het eerste deel {}is de matchquery, waarbij wordt gefilterd welke documenten moeten worden bijgewerkt (in dit geval alle documenten).

  • Het tweede deel [{ $set: { a: { $toDate: "$a" } } }]is de update-aggregatiepijplijn (let op de vierkante haakjes die het gebruik van een aggregatiepijplijn). $setis een nieuwe aggregatie-operator die in dit geval de waarde van het veld vervangt. De vervangen waarde is het veld zelf dat is afgestemd op een ISODate-object. Merk op hoe arechtstreeks wordt gewijzigd op basis van zijn eigen waarde ($a).

  • Vergeet { multi: true }niet, anders wordt alleen het eerste overeenkomende document bijgewerkt. Of als alternatief kan men updateManygebruiken in plaats van update: db.collection.updateMany(...).


Antwoord 5

Als u wilt controleren of het veld al is geconverteerd, kunt u deze voorwaarde gebruiken:

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

Anders kan de opdrachtregel breken.

Other episodes