Vous devez utiliser le .aggregate()
méthode qui donne accès aux pipelines d'agrégation.
Dans votre $project
étape, vous devez utiliser le $concat
opérateur pour concaténer votre champ.
Vous pouvez ensuite utiliser votre résultat d'agrégation pour mettre à jour votre collection en utilisant "bulk" opérations pour plus d'efficacité
var bulk = db.events.initializeOrderedBulkOp();
var count = 0;
db.events.aggregate([
{ "$project": {
"iso_start": { "$concat": [ "$date", " ", "$time" ] },
"iso_end": { "$concat": [ "$date", " ", "$endtime" ] }
}}
]).forEach(function(doc) {
bulk.find({'_id': doc._id}).updateOne({
"$set": {
"iso_start": new Date(doc.iso_start),
"iso_end": new Date(doc.iso_end)
}
});
count++;
if(count % 200 === 0) {
// update per 200 operations and re-init
bulk.execute();
bulk = db.events.initializeOrderedBulkOp();
}
})
// Clean up queues
if(count > 0) bulk.execute();
Après cette opération vos documents ressemblent à ceci :
{
"_id" : "aaaaaaaaaaaa",
"title" : "Hello, World!",
"date" : "Thursday, November 12, 2015",
"time" : "9:30 AM",
"endtime" : "11:30 AM",
"iso_start" : ISODate("2015-11-12T06:30:00Z"),
"iso_end" : ISODate("2015-11-12T08:30:00Z")
}
{
"_id" : "bbbbbbbbbbbb",
"title" : "To B or not to B",
"date" : "Thursday, November 12, 2015",
"time" : "10:30 AM",
"endtime" : "11:00 AM",
"iso_start" : ISODate("2015-11-12T07:30:00Z"),
"iso_end" : ISODate("2015-11-12T08:00:00Z")
}
Ce n'est pas la fin de l'histoire car le "Bulk" L'API et ses méthodes associées sont obsolètes dans la prochaine version (version 3.2 ) donc à partir de cette version, nous devrons utiliser le db.collection.bulkWrite()
méthode.
var operations = [];
db.events.aggregate([
{ "$project": {
"iso_start": { "$concat": [ "$date", " ", "$time" ] },
"iso_end": { "$concat": [ "$date", " ", "$endtime" ] }
}}
]).forEach(function(doc) {
var operation = {
updateOne: {
filter: { "_id": doc._id },
update: {
"$set": {
"iso_start": new Date(doc.iso_start),
"iso_end": new Date(doc.iso_end)
}
}
}
};
operations.push(operation);
})
operations.push({ ordered: true, writeConcern: { w: "majority", wtimeout: 5000 } });
db.events.bulkWrite(operations)