2016-12-29 2 views
2

Je m'exerçais simplement sur mes requêtes MongoDB et j'ai frappé un mur avec un type de données de champ. J'utilise actuellement Robomongo comme GUI pour accéder à la base de données de production.MongoDB: Convertir la chaîne de date (mm/jj/aaaa) en timestamp Unix

Ma structure du document ressemble:

Robomongo Document Structure

Y at-il un opérateur MongoDB ou moyen/méthode pour convertir la valeur du champ date, actuellement en format mm/dd/yyyy, à un horodatage Unix afin que nous puissions effectuer des opérations de filtrage ?

Répondre

0

Vous pouvez itérer tous vos éléments et les mettre à jour un par un avec la conversion en Date. Voici un exemple pour convertir votre date mm/dd/yyyy-ISODate:

db.test.find().forEach(function(res){ 

     if (typeof(res.date)=="string"){ 
     var arr = res.date.split("/"); 
     res.date = new Date(arr[2], arr[0] - 1, arr[1]); 
     db.test.save(res) 
     } 
    } 
) 

Pour horodatage Unix (Millis d'époque), vous pouvez appeler getTime() de Date:

db.test.find().forEach(function(res){ 

     if (typeof(res.date)=="string"){ 
     var arr = res.date.split("/"); 
     res.date = new Date(arr[2], arr[0] - 1, arr[1]).getTime(); 
     db.test.save(res) 
     } 
    } 
) 

Notez que ces dates seront converties au format UTC, donc vous pouvez vouloir changer temporairement votre fuseau horaire avant de faire votre conversion

Vous pouvez également utiliser bulk update si vous voulez optimiser les performances de mise à jour

Vous pouvez également simplement convertir votre date en yyyy-mm-dd qui préservera le tri (vérifiez this post). Ce qui suit se décompose votre champ de date dans day, month et year, champ de date fixée avec le nouveau format et écrire la sortie dans une nouvelle collection nommée test2:

db.test.aggregate([{ 
    $project: { 
     startTime: 1, 
     endTime: 1, 
     date: { 
      $let: { 
       vars: { 
        year: { $substr: ["$date", 6, 10] }, 
        month: { $substr: ["$date", 0, 2] }, 
        dayOfMonth: { $substr: ["$date", 3, 2] } 
       }, 
       in : { $concat: ["$$year", "-", "$$month", "-", "$$dayOfMonth"] } 
      } 
     } 
    } 
},{ 
    $out :"test2" 
}]) 
+0

Merci @BertrandMartel. Ceci est vraiment utile mais je cherchais à garder cela dans MongoDB car cela fait partie d'une requête globale. Si tout est possible, je cherche à éviter d'utiliser Javascript, PHP, etc. pour faire la conversion. Existe-t-il un processus utilisant divers opérateurs MongoDB pour y parvenir? –

+0

J'ai mis à jour mon article avec un moyen de convertir votre format de date de chaîne en 'aaaa-mm-dd 'ce qui n'est pas ce que vous voulez en premier lieu mais qui préserve le tri par rapport à' mm-dd-yyyy' –