web-dev-qa-db-fra.com

Comment remplacer une sous-chaîne dans le document mongodb

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

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

Je veux remplacer helloWorldt par helloWorldFinal Output:

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

comment puis-je y parvenir pour tous les documents de la collection ABC

42
user1071979
db.media.find({mediaContainer:"ContainerS3"}).forEach(function(e,i) {
    e.url=e.url.replace("//a.n.com","//b.n.com");
    db.media.save(e);
});
84
Naveed

Actuellement, vous ne pouvez pas utiliser la valeur d'un champ pour le mettre à jour. Vous devrez donc parcourir les documents et mettre à jour chaque document à l'aide d'une fonction. Voici un exemple d'utilisation: MongoDB: mise à jour de documents à l'aide de données du même document

6
Louisa

nodejs. Utiliser le 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});
  });
});
4
Lukas

Pour remplacer TOUTES LES OCCURRENCES de la sous-chaîne dans votre document, utilisez:

db.media.find({mediaContainer:"ContainerS3"}).forEach(function(e,i) {
var find = "//a.n.com";
var re = new RegExp(find, 'g');
e.url=e.url.replace(re,"//b.n.com");
db.media.save(e);
});
4
Michael Michelis

La mise en forme de mon commentaire pour la réponse sélectionnée (la réponse de @ Naveed) a été brouillée - ajoutez donc ceci comme réponse. Tout le mérite revient à Naveed.

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

Tout simplement génial ... Mon cas était - j'ai un champ qui est un tableau - alors j'ai dû ajouter une boucle supplémentaire.

Ma requête est:

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));
})
2
Himel Nag Rana

Maintenant tu peux le faire!

Nous pouvons utiliser le script Mongo pour manipuler des données à la volée. Ça marche pour moi!

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

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

Je souhaite supprimer la dernière virgule redondante, la nouvelle adresse attendue "" 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 t'aides!

1
Dac Nguyen

Au cas où, si vous utilisez des exemples parmi les réponses fournies ici et obtenez "Enregistrements existants mis à jour" lors de l’exécution de votre script de remplacement, vérifiez si votre client est connecté au noeud MongoDB principal qui vous permet de stocker/écrire les modifications.

0
Sergey Shcherbakov