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
db.media.find({mediaContainer:"ContainerS3"}).forEach(function(e,i) {
e.url=e.url.replace("//a.n.com","//b.n.com");
db.media.save(e);
});
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
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});
});
});
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);
});
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));
})
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!
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.