2017-10-19 16 views
0

Je suis très nouveau sur MongoDB et ses requêtes mais pour l'instant, je ne peux pas changer une 'colonne' dans une collection de la chaîne à ce jour.String à ce jour dans MongoDB shell ou PyMongo

Ma base de données et la collection s'appellent tous les deux thdr. Je souhaite remplacer la colonne "PSTNG_DATE" par un format de date. Pour le moment, le format est '19.10.2017 '.

MongoDB Compass

Je suis passé par les fils ici et essayé quelques trucs, mais il ne semble pas fonctionner. Je comprends que je peux soit le changer via le Shell MongoDB ou en utilisant PyMongo.

J'apprécie beaucoup votre aide et vos conseils, merci beaucoup.

** Mise à jour ** C'est ce que j'ai en ce moment et il me donne l'erreur de syntaxe

db = db.getSiblingDB('thdr'); 
var requests = []; 
db.thdr.find().forEach(doc => { 
    var date = yourFunctionThatConvertsStringToDate(doc.PSTNG_DATE); 
    requests.push({ 
     'updateOne': { 
      'filter': { '_id': doc._id }, 
      'update': { '$set': { 
       "PSTNG_DATE": date 
      } } 
     } 
    }); 
    if (requests.length === 500) { 
     db.thdr.bulkWrite(requests); 
     requests = []; 
    } 
}); 

if(requests.length > 0) { 
    db.thdr.bulkWrite(requests); 
} 
+0

Dupe possible de https://stackoverflow.com/questions/10942931/converting-string-to-date-in-mongodb – JohnnyHK

Répondre

1

Vous pouvez le faire avec un bulkWrite:

db = db.getSiblingDB('yourDatabaseName'); 
var requests = []; 
db.yourCollectionName.find().forEach(doc => { 
var strDate = doc.PSTNG_DATE; 
var dateParts = strDate.split("."); 
var date = new Date(dateParts[2], (dateParts[1] - 1), dateParts[0]); 
    requests.push({ 
     'updateOne': { 
      'filter': { '_id': doc._id }, 
      'update': { '$set': { 
       "PSTNG_DATE": date 
      } } 
     } 
    }); 
    if (requests.length === 500) { 
     db.yourCollectionName.bulkWrite(requests); 
     requests = []; 
    } 
}); 

if(requests.length > 0) { 
    db.yourCollectionName.bulkWrite(requests); 
} 

Il faudrait mettre à jour chaque document. Ainsi, au lieu de faire une mise à jour sur chaque document, vous pouvez ajouter la méthode de collecte updateOne() à un tableau (requests) et les exécuter dans un bulkWrite(...) Chargez le script comme décrit ici https://docs.mongodb.com/manual/reference/method/load/ directement sur votre serveur mongodb et exécutez-le. J'espère que cela t'aides.

FYI: A l'intérieur du find() vous pouvez réellement ajouter une requête si vous le souhaitez (c'est même préférable, surtout si vous recherchez un champ indexé). Cela réduirait la charge et la quantité de documents à remplacer en une fois.

+0

a changé le nom de la base de données en thdr, collé le script dans un fichier .js et utilisé la méthode de chargement dans la coquille de mongo. Je reçois une erreur de syntaxe. '> load (C: \ Users \ moi \ Desktop \ asd \ update2.js) 2017-10-19T15: 53: 15.917 + 0200 E QUERY [thread1] SyntaxError: malformé Unicode séquence d'échappement de caractères @ (shellhelp1): 1 : 24 error2: SyntaxError: malformé Unicode caractère d'échappement séquence @ (shellhelp1): 1: 24' –

+0

Vous oubliez this "peut-être? Charger (" C: \ Utilisateurs \ moi \ Desktop \ asd \ update2.js ") –

+0

J'ai mis à jour le post avec le .Js modifié en utilisant "didnt faire l'affaire –