203 votes

MongoDB : Comment changer le type d'un champ ?

Il y a déjà une question dans Stackoverflow, très similaire à ma question. Le problème est que la réponse à cette question concernait un pilote Java, alors que j'essaie de le faire dans le shell.

Je fais ça...

db.meta.update({'fields.properties.default': { $type : 1 }}, {'fields.properties.default': { $type : 2 }})

Ça ne marche pas !

0 votes

Si quelqu'un se trouve dans la même situation que moi, devant toString le champ d'un document, voici le petit programme que j'ai fait/utilisé .

229voto

Gates VP Points 26481

La seule façon de modifier le $type des données est d'effectuer une mise à jour des données lorsque celles-ci ont le bon type.

Dans ce cas, il semble que vous essayez de modifier l'adresse de l'utilisateur. $type de 1 (double) à 2 (corde). http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24type

Il suffit donc de charger le document depuis la BD, d'effectuer le cast ( new String(x) ), puis enregistrez à nouveau le document.

Si vous devez effectuer cette opération de manière programmatique et entièrement à partir du shell, vous pouvez utiliser la fonction find(...).forEach(function(x) {}) la syntaxe.


En réponse au deuxième commentaire ci-dessous. Changez le champ bad d'un nombre à une chaîne de caractères dans une collection foo .

db.foo.find( { 'bad' : { $type : 1 } } ).forEach( function (x) {   
  x.bad = new String(x.bad); // convert field to string
  db.foo.save(x);
});

1 votes

Est-il possible de donner un exemple - changer le type d'un champ de int à string (ou vice versa), à partir du shell ?

0 votes

Le code ci-dessus convertit les données du champ de double à tableau au lieu de double à chaîne. Mes données réelles étaient dans ce format : 3.1 alors que le code simone fonctionne bien pour moi.

2 votes

J'avais une situation où je devais convertir le champ _id et ne pas entrer en conflit avec d'autres index : db.questions.find({_id:{$type:16}}).forEach( function (x) { db.questions.remove({_id:x._id},true); x._id = ""+x._id; db.questions.save(x); });

173voto

Simone Points 431

// Chaine en entier

db.db-name.find({field-name : {$exists : true}}).forEach( function(obj) { obj.field-name = new NumberInt( obj.field-name ); db.db-name.save(obj); } );

// De Integer à String

db.db-name.find({field-name : {$exists : true}}).forEach( function(obj) { obj.field-name = ""+obj.field-name; db.db-name.save(obj); } );

0 votes

C'est génial. Savez-vous comment convertir une chaîne de caractères (pensez à une devise comme '1,23') en un nombre entier 123 ? Je suppose qu'il faut l'analyser en tant que valeur flottante ou décimale, la multiplier par 100, puis l'enregistrer en tant que nombre entier, mais je ne trouve pas la documentation nécessaire pour le faire. Merci !

0 votes

En fait, ce fonctionnement est bon. Mais j'ai une application fonctionnant avec mongoid 2.4.0-stable qui a des champs tels que field : customer_count, type : Integer & une validation comme validates_numericality_of :customer_count qui fonctionnait bien. Maintenant, lorsque je passe à la version 3.0.16 de Mongoid, lorsque j'attribue une valeur de chaîne, elle est automatiquement convertie en 0. sans erreur. Je veux lancer une erreur sur une mauvaise affectation de données, ce comportement s'avère étrange pour moi.

4 votes

Je l'ai exécuté et j'ai obtenu l'erreur suivante : Erreur : impossible de convertir une chaîne de caractères en entier (shell):1

47voto

David Dehghan Points 1047

C'est ce que j'ai utilisé pour la conversion des chaînes de caractères en int.

db.my_collection.find().forEach( function(obj) {
    obj.my_value= parseInt(obj.my_value);
    db.my_collection.save(obj);

});

2 votes

Je recommanderais également de spécifier le radix - developer.mozilla.org/fr/US/docs/Web/JavaScript/Référence/

5 votes

Attention J'ai testé cela avec Robomongo, et cela a donné le type 1 : double. J'ai dû utiliser new NumberInt()

0 votes

Daniel, ta solution n'est pas bonne... la solution de David est bonne.

29voto

Russell Points 31
db.coll.find().forEach(function(data) {
    db.coll.update({_id:data._id},{$set:{myfield:parseInt(data.myfield)}});
})

3voto

Giulio Roggero Points 646

Pour convertir int32 en string dans mongo sans créer de tableau ajoutez simplement "" à votre numéro :-)

db.foo.find( { 'mynum' : { $type : 16 } } ).forEach( function (x) {   
  x.mynum = x.mynum + ""; // convert int32 to string
  db.foo.save(x);
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X