Comment remplacer le substrat 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 helloWorld Production Finale:

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

comment réaliser ceci pour tous les documents de la collection ABC

30
demandé sur user1071979 2012-09-25 23:29:14

8 réponses

db.media.find({mediaContainer:"ContainerS3"}).forEach(function(e,i) {
    e.url=e.url.replace("//a.n.com","//b.n.com");
    db.media.save(e);
});
73
répondu Naveed 2016-06-20 14:54:11

Actuellement, vous ne pouvez pas utiliser la valeur d'un champ pour le mettre à jour. Vous devrez donc itérer les documents et mettre à jour chaque document à l'aide d'une fonction. Il ya un exemple de la façon dont vous pourriez faire cela ici: MongoDB: mise à jour des documents en utilisant les données du même document

6
répondu Louisa 2017-05-23 11:54:50

nodejs. En utilisant 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});
  });
});
3
répondu Lukas 2016-07-25 18:42:08

maintenant tu peux le faire!

nous pouvons utiliser le script Mongo pour manipuler les données à la volée. Il 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 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);

  }
}

Espérons que cette aide!

1
répondu Dac Nguyen 2015-11-03 12:58:39

Pour remplacer TOUS 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);
});
1
répondu Michael Michelis 2018-08-14 17:31:41

le formatage de mon commentaire à la réponse sélectionnée (la réponse de@Naveed) a été brouillé - donc en ajoutant 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 - j'ai donc 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));
})
0
répondu Himel Nag Rana 2017-10-11 06:20:42

juste au cas où si vous utilisez des exemples des réponses ici et obtenez" mis à jour 0 enregistrements existants " lors de l'exécution de votre script de remplacement, vérifiez si votre client est connecté au noeud MongoDB primaire qui vous permet de stocker/écrire des modifications.

0
répondu Sergey Shcherbakov 2018-01-22 12:51:27

vous pouvez essayer sous le pipeline d'agrégation dans la version 3.4 .

requête D'agrégation pour remplacer la chaîne de recherche par la chaîne de remplacement.

la logique est de localiser la chaîne de recherche ( $indexOfCP ) suivie de $concat pour joindre toutes les parties ( $substrCP ), la partie avant la chaîne de recherche appariée, la chaîne de remplacement et le reste de la chaîne originale.

mise à jour en bloc pour écrire la nouvelle structure d'url.

var bulk = db.getCollection(col).initializeUnorderedBulkOp();
var count = 0;
var batch = 1;

db.getCollection(col).aggregate([
  {"$project":{
    "URL":{
      "$let":{
        "vars":{
          "len":{
            "$strLenCP":"helloWorldt"},"start":{"$indexOfCP":["$URL","helloWorldt"]}
        },
        "in":{
          "$concat":[
            {"$substrCP":["$URL",0,"$$start"]},
            "helloWorld",
            {"$substrCP":[
              "$URL",
              {"$add":["$$start","$$len"]},
              {"$subtract":[{"$strLenCP":"$URL"},{"$add":["$$start","$$len"]}]}
            ]}
          ]
        }
      }
    }
  }}
]).forEach(function(doc){ 
    var _id = doc._id; 
    var url = doc.URL; 
    bulk.find({ "_id" : _id }).updateOne(
        { $set: {"URL" : url } }
    ); 
    count++;  
    if (count == batch) { 
      bulk.execute(); 
      bulk = db.getCollection(col).initializeUnorderedBulkOp(); 
      count = 0;
    } 
});

 if (count > 0) { 
    bulk.execute(); 
 }
0
répondu Veeram 2018-01-22 13:51:40