Comment remplacer une sous-chaîne dans mongodb document
J'ai beaucoup de mongodb documents dans une collection de la forme:
{
....
"URL":"www.abc.com/helloWorldt/..."
.....
}
Je veux remplacer helloWorldt
avec helloWorld
pour obtenir:
{
....
"URL":"www.abc.com/helloWorld/..."
.....
}
Comment puis-je obtenir ce pour tous les documents de ma collection?
Vous devez vous connecter pour publier un commentaire.
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)); })
Actuellement, vous ne pouvez pas utiliser la valeur d'un champ à mettre à jour. De sorte que vous aurez à parcourir les documents et la mise à jour de chaque document à l'aide d'une fonction. Il y a un exemple de comment vous pouvez le faire ici: MongoDB: mise à Jour de documents à l'aide de données à partir du même document
nodejs. À l'aide de mongodb paquet de mnp
Pour remplacer TOUS occurrences de la sous-chaîne dans votre document, utilisez:
La mise en forme de mon commentaire à la réponse choisie (@Naveed réponse) a brouillé - afin d'ajouter cela comme une réponse. Tout le crédit va à 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:
De départ
Mongo 4.2
,db.collection.mise à jour()
peut accepter une agrégation de pipeline, enfin, en permettant la mise à jour d'un champ basé sur un autre terrain:C'est un peu prolixe puisqu'il n'y a pas une chaîne correcte
$replace
opérateur de encore.La première partie
{ URL: { $regex: "/helloWorldt/" } }
est le match de la requête, le filtrage des documents de mise à jour (ceux avec bonjour tout le monde, à tort, orthographié).La deuxième partie
[{ $set: { URL: ... } }]
est la mise à jour de l'agrégation de pipeline (note carrés de crochets, ce qui signifie l'utilisation d'une agrégation de pipeline).$set
est un nouvel opérateur d'agrégation qui, dans ce cas crée/remplace un champ. La nouvelle valeur est bizarrement calculé à l'aide d'un mélange de$concat
et$split
par manque d'une bonne chaîne de$replace
de l'opérateur. Notez commentURL
est modifié directement sur la base de sa propre valeur ($URL
).N'oubliez pas
{ multi: true }
, sinon seul le premier document correspondant sera mis à jour.Maintenant vous pouvez le faire!
Nous pouvons utiliser Mongo script pour manipuler des données à la volée. Il fonctionne pour moi!
J'utilise ce script pour corriger mes données d'adresse.
Exemple actuel de l'adresse: "N ° 12, CINQUIÈME AVENUE,".
Je veux supprimer le dernier redondant par des virgules, l'attend une nouvelle adresse ""N ° 12, CINQUIÈME AVENUE".
Espérons que cette aide!
Juste au cas où si vous êtes en utilisant des exemples de réponses ici et obtenir "0 mis à Jour les enregistrements existants" lors de l'exécution de remplacer votre script, vérifiez si votre client est connecté à l'MongoDB nœud qui vous permet de stocker/écrire les changements.
À l'aide de mongodump,bsondump et mongoimport.
Parfois mongodb collections pouvez obtenir à peu complexe avec des tableaux imbriqués/objets etc, où il serait relativement difficile de construire des boucles autour d'eux. Mon travail autour est un peu cru, mais fonctionne dans la plupart des scénarios, indépendamment de la complexité de la collection.
1. Exporter La collection à l'aide de mongodump dans .bfils
2. Convertir des .bfils dans .format json à l'aide de bsondump
3. Remplacer les chaînes de la .fichier json avec sed(pour linux terminal) ou avec d'autres outils
4. Importer le .json collection avec mongoimport avec --baisse de la balise de où il les priverait de la collection, avant de les importer
exemple