Ich habe viele Mongodb-Dokumente in einer Sammlung des Formulars:
{
....
"URL":"www.abc.com/helloWorldt/..."
.....
}
Ich möchte ersetzen helloWorldt
durch helloWorld
:
{
....
"URL":"www.abc.com/helloWorld/..."
.....
}
Wie kann ich dies für alle Dokumente in meiner Sammlung erreichen?
mongodb
mongodb-.net-driver
mongo-shell
mongodb-update
user1071979
quelle
quelle
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)); })
Heutzutage,
Mongo 4.2
,db.collection.updateMany
(alias derdb.collection.update
basierend auf seinen eigenen Wert) kann eine Aggregations Pipeline schließlich nehmen die Aktualisierung eines Feldes ermöglicht.Mongo 4.4
sofort$replaceOne
macht es der neue Aggregationsoperator sehr einfach, einen Teil einer Zeichenfolge zu ersetzen.// { URL: "www.abc.com/helloWorldt/..." } // { URL: "www.abc.com/HelloWo/..." } db.collection.updateMany( { URL: { $regex: /helloWorldt/ } }, [{ $set: { URL: { $replaceOne: { input: "$URL", find: "helloWorldt", replacement: "helloWorld" } }} }] ) // { URL: "www.abc.com/helloWorld/..." } // { URL: "www.abc.com/HelloWo/..." }
{ URL: { $regex: /helloWorldt/ } }
) ist die Übereinstimmungsabfrage, bei der gefiltert wird, welche Dokumente aktualisiert werden sollen (welche enthalten"helloWorldt"
), und die nur dazu dient, die Abfrage zu beschleunigen.$set: { URL: {...
) ist die Aktualisierungsaggregationspipeline (beachten Sie die eckigen Klammern, die die Verwendung einer Aggregationspipeline angeben):$set
ist ein neuer Aggregationsoperator (Mongo 4.2
), der in diesem Fall den Wert eines Feldes ersetzt.$replaceOne
Operator berechnet . Beachten Sie, wieURL
direkt basierend auf dem eigenen Wert ($URL
) geändert wird .Vor
Mongo 4.4
und nach dem StartMongo 4.2
müssen$replace
wir aufgrund des Fehlens eines geeigneten String- Operators eine Bancal-Mischung aus$concat
und$split
:db.collection.updateMany( { URL: { $regex: "/helloWorldt/" } }, [{ $set: { URL: { $concat: [ { $arrayElemAt: [ { $split: [ "$URL", "/helloWorldt/" ] }, 0 ] }, "/helloWorld/", { $arrayElemAt: [ { $split: [ "$URL", "/helloWorldt/" ] }, 1 ] } ] }} }] )
quelle
find
?$regex
Operator (dh$regex: "/helloWorldt/"
) sind Trennzeichen für reguläre Ausdrücke, die erforderlich sind. An allen anderen Stellen im Beispiel sind die Schrägstriche URL-Pfadbegrenzer und wahrscheinlich nicht erforderlich. Sie wären nur notwendig, wenn das OP URLs mit einem Pfad hätte, der / helloWorldthirsty / enthält, den sie behalten wollten.Derzeit können Sie den Wert eines Felds nicht zum Aktualisieren verwenden. Sie müssen also die Dokumente durchlaufen und jedes Dokument mithilfe einer Funktion aktualisieren. Hier finden Sie ein Beispiel, wie Sie dies tun können: MongoDB: Aktualisieren von Dokumenten mithilfe von Daten aus demselben Dokument
quelle
nodejs. Verwendung des Mongodb-Pakets ab 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}); }); });
quelle
Verwenden Sie Folgendes, um ALLE Vorkommen der Teilzeichenfolge in Ihrem Dokument zu ersetzen :
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); });
quelle
Die Formatierung meines Kommentars auf die ausgewählte Antwort (@ Naveeds Antwort) wurde verschlüsselt - fügen Sie dies also als Antwort hinzu. Alle Kredite gehen an Naveed.
-------------------------------------------------- --------------------
Einfach super. Mein Fall war - ich habe ein Feld, das ein Array ist - also musste ich eine zusätzliche Schleife hinzufügen.
Meine Anfrage lautet:
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)); })
quelle
Mit Mongodump, Bsondump und Mongoimport.
Manchmal können die Mongodb-Sammlungen mit verschachtelten Arrays / Objekten usw. wenig komplex werden, wobei es relativ schwierig wäre, Schleifen um sie herum zu erstellen. Meine Arbeit ist etwas roh, funktioniert aber in den meisten Szenarien, unabhängig von der Komplexität der Sammlung.
1. Exportieren Sie die Sammlung mit Mongodump in .bson
2. Konvertieren Sie .bson mit bsondump in das .json-Format
bsondump --outFile products.json data/<db_name>/products.bson
3. Ersetzen Sie die Zeichenfolgen in der .json-Datei durch sed (für Linux-Terminal) oder durch andere Tools
sed -i 's/oldstring/newstring/g' products.json
4. Importieren Sie die .json-Sammlung mit mongoimport mit dem Tag --drop zurück, wo die Sammlung vor dem Import entfernt wird
Beispiel
mongodump --uri "mongodb://mongoadmin:[email protected]:27017,10.148.0.8:27017,10.148.0.9:27017/my-dbs?replicaSet=rs0&authSource=admin" --collection=products --out=data/
quelle
Jetzt kannst du es schaffen!
Wir können das Mongo-Skript verwenden, um Daten im laufenden Betrieb zu bearbeiten. Für mich geht das!
Ich benutze dieses Skript, um meine Adressdaten zu korrigieren.
Beispiel für die aktuelle Adresse: "No.12, FIFTH AVENUE,".
Ich möchte das letzte redundante Komma entfernen, die erwartete neue Adresse "" Nr. 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); } }
Hoffe das hilft!
quelle
Dies kann mithilfe von
Regex
im ersten Teil der Methode erfolgenreplace
und ersetzt dieg
Vorkommen dieser Zeichenfolge durch die zweite Zeichenfolge. Dies ist derselbe reguläre Ausdruck wie in Javascript, z.const string = "www.abc.com/helloWorldt/..."; console.log(string); var pattern = new RegExp(/helloWorldt/) replacedString = string.replace(pattern, "helloWorld"); console.log(replacedString);
Da der reguläre Ausdruck die Zeichenfolge ersetzt, können wir dies jetzt problemlos in der MongoDB-Shell tun, indem wir jedes Element nach der Methode suchen und iterieren
forEach
und nacheinander in derforEach
Schleife wie folgt speichern :> db.media.find() { "_id" : ObjectId("5e016628a16075c5bd26fbe3"), "URL" : "www.abc.com/helloWorld/" } { "_id" : ObjectId("5e016701a16075c5bd26fbe4"), "URL" : "www.abc.com/helloWorldt/" } > > db.media.find().forEach(function(o) {o.URL = o.URL.replace(/helloWorldt/, "helloWorld"); printjson(o);db.media.save(o)}) { "_id" : ObjectId("5e016628a16075c5bd26fbe3"), "URL" : "www.abc.com/helloWorld/" } { "_id" : ObjectId("5e016701a16075c5bd26fbe4"), "URL" : "www.abc.com/helloWorld/" } > db.media.find() { "_id" : ObjectId("5e016628a16075c5bd26fbe3"), "URL" : "www.abc.com/helloWorld/" } { "_id" : ObjectId("5e016701a16075c5bd26fbe4"), "URL" : "www.abc.com/helloWorld/" } >
quelle
Nur für den Fall, dass Sie Beispiele aus den Antworten hier verwenden und beim Ausführen Ihres Ersetzungsskripts "0 vorhandene Datensätze aktualisiert" erhalten, prüfen Sie, ob Ihr Client mit dem primären MongoDB-Knoten verbunden ist, über den Sie Änderungen speichern / schreiben können.
quelle
Wenn Sie nach einer Unterzeichenfolge suchen und diese durch eine andere ersetzen möchten, können Sie Folgendes versuchen:
db.collection.find({ "fieldName": /.*stringToBeReplaced.*/ }).forEach(function(e, i){ if (e.fieldName.indexOf('stringToBeReplaced') > -1) { e.content = e.content.replace('stringToBeReplaced', 'newString'); db.collection.update({ "_id": e._id }, { '$set': { 'fieldName': e.fieldName} }, false, true); } })
quelle