118 votes

Comment remplacer une sous-chaîne dans un document mongodb ?

J'ai beaucoup de documents mongodb dans une collection de la forme :

{
....
"URL":"www.abc.com/helloWorldt/..."
.....
}

Je veux remplacer helloWorldt con helloWorld pour obtenir :

{
....
"URL":"www.abc.com/helloWorld/..."
.....
}

Comment puis-je réaliser cela pour tous les documents de ma collection ?

5voto

Lukas Liesis Points 564

Nodejs. Utilisation de paquet mongodb de npm

db.collection('ABC').find({url: /helloWorldt/}).toArray((err, docs) => {
  docs.forEach(doc => {
    let URL = doc.URL.replace('helloWorldt', 'helloWorld');
    db.collection('ABC').updateOne({_id: doc._id}, {URL});
  });
});

4voto

Himel Nag Rana Points 609

Le formatage de mon commentaire à la réponse sélectionnée (réponse de @Naveed) s'est brouillé - j'ajoute donc ceci comme réponse. Tout le mérite revient à Naveed.

----------------------------------------------------------------------

Juste génial. Mon cas était le suivant : j'ai un champ qui est un tableau, j'ai donc dû ajouter une boucle supplémentaire.

Ma question est la suivante :

db.getCollection("profile").find({"photos": {$ne: "" }}).forEach(function(e,i) {
    e.photos.forEach(function(url, j) {
        url = url.replace("http://a.com", "https://dev.a.com");
        e.photos[j] = url;
    });
    db.getCollection("profile").save(e);
    eval(printjson(e));
})

2voto

Dac Nguyen Points 67

Maintenant, vous pouvez le faire !

Nous pouvons utiliser Mongo script pour manipuler les données à la volée. Cela fonctionne pour moi !

J'utilise ce script pour corriger mes données d'adresse.

Exemple d'adresse actuelle : "No.12, FIFTH AVENUE,".

Je veux supprimer la dernière virgule redondante, la nouvelle adresse prévue ""No.12, FIFTH AVENUE"".

var cursor = db.myCollection.find().limit(100);

while (cursor.hasNext()) {
  var currentDocument = cursor.next();

  var address = currentDocument['address'];
  var lastPosition = address.length - 1;

  var lastChar = address.charAt(lastPosition);

  if (lastChar == ",") {

    var newAddress = address.slice(0, lastPosition);

    currentDocument['address'] = newAddress;

    db.localbizs.update({_id: currentDocument._id}, currentDocument);

  }
}

J'espère que cela vous aidera !

2voto

krishna Points 56

Cela peut être fait en utilisant l'option Regex dans la première partie de la méthode replace et il remplacera le [all if g en motif regex] occurrence(s) de cette chaîne avec la seconde chaîne, il s'agit de la même regex qu'en Javascript, par ex :

const string = "www.abc.com/helloWorldt/...";
console.log(string);
var pattern = new RegExp(/helloWorldt/)
replacedString = string.replace(pattern, "helloWorld");
console.log(replacedString);

Puisque la regex remplace la chaîne de caractères, nous pouvons maintenant le faire dans le shell MongoDB facilement en trouvant et en itérant avec chaque élément par la méthode forEach et les sauvegarder un par un dans le forEach boucle comme ci-dessous :

> db.media.find()
{ "_id" : ObjectId("5e016628a16075c5bd26fbe3"), "URL" : "www.abc.com/helloWorld/" }
{ "_id" : ObjectId("5e016701a16075c5bd26fbe4"), "URL" : "www.abc.com/helloWorldt/" }
> 
> db.media.find().forEach(function(o) {o.URL = o.URL.replace(/helloWorldt/, "helloWorld"); printjson(o);db.media.save(o)})
{
    "_id" : ObjectId("5e016628a16075c5bd26fbe3"),
    "URL" : "www.abc.com/helloWorld/"
}
{
    "_id" : ObjectId("5e016701a16075c5bd26fbe4"),
    "URL" : "www.abc.com/helloWorld/"
}
> db.media.find()
{ "_id" : ObjectId("5e016628a16075c5bd26fbe3"), "URL" : "www.abc.com/helloWorld/" }
{ "_id" : ObjectId("5e016701a16075c5bd26fbe4"), "URL" : "www.abc.com/helloWorld/" }
>

2voto

rafee_que_ Points 423

Si vous voulez rechercher une sous-chaîne de caractères, et la remplacer par une autre, vous pouvez essayer comme ci-dessous,

    db.collection.find({ "fieldName": /.*stringToBeReplaced.*/ }).forEach(function(e, i){
        if (e.fieldName.indexOf('stringToBeReplaced') > -1) {
          e.content = e.content.replace('stringToBeReplaced', 'newString');
          db.collection.update({ "_id": e._id }, { '$set': { 'fieldName': e.fieldName} }, false, true);
        }
    })

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