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
$toDate
aggregatie-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).$set
is 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 eenISODate
-object. Merk op hoea
rechtstreeks 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 menupdateMany
gebruiken in plaats vanupdate
: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.