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
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);
});
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
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});
});
});
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!
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);
});
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));
})
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.
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();
}