it-swarm.com.de

So ersetzen Sie die Teilzeichenfolge im mongodb-Dokument

Ich habe viele mongodb-Dokumente in einer Sammlung ABC des Formulars:

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

Ich möchte helloWorldt durch helloWorldFinal Output ersetzen:

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

wie erreiche ich dies für alle Dokumente in der Sammlung ABC

42
user1071979
db.media.find({mediaContainer:"ContainerS3"}).forEach(function(e,i) {
    e.url=e.url.replace("//a.n.com","//b.n.com");
    db.media.save(e);
});
84
Naveed

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. Es gibt ein Beispiel, wie Sie dies hier tun könnten: MongoDB: Dokumente mit Daten aus demselben Dokument aktualisieren

6
Louisa

nodejs. mongodb-Paket von npm verwenden

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});
  });
});
4
Lukas

Um ALLE Vorkommen des Teilstrings in Ihrem Dokument zu ersetzen, verwenden Sie:

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);
});
4

Ab Mongo 4.2 Kann db.collection.update() eine Aggregationspipeline akzeptieren und schließlich die Aktualisierung eines Felds basierend auf einem anderen Feld ermöglichen:

// { URL: "www.abc.com/helloWorldt/..." }
// { URL: "www.abc.com/HelloWo/..." }
db.collection.update(
  { URL: { $regex: "/helloWorldt/" } },
  [{
    $set: { URL: {
      $concat: [
        { $arrayElemAt: [ { $split: [ "$URL", "/helloWorldt/" ] }, 0 ] },
        "/helloWorld/",
        { $arrayElemAt: [ { $split: [ "$URL", "/helloWorldt/" ] }, 1 ] }
      ]
    }}
  }],
  { multi: true }
)
// { URL: "www.abc.com/helloWorld/..." }
// { URL: "www.abc.com/HelloWo/..." }

Dies ist etwas ausführlich, da es noch keinen richtigen String-Operator $replace Gibt.

  • Der erste Teil { URL: { $regex: "/helloWorldt/" } } Ist die Übereinstimmungsabfrage, bei der gefiltert wird, welche Dokumente aktualisiert werden sollen (diejenigen, bei denen hallo world falsch geschrieben ist).

  • Der zweite Teil [{ $set: { URL: ... } }] Ist die Aktualisierungsaggregationspipeline (beachten Sie die eckigen Klammern, die die Verwendung einer Aggregationspipeline kennzeichnen). $set ist ein neuer Aggregationsoperator, der in diesem Fall ein Feld erstellt/ersetzt. Der neue Wert wird seltsamerweise mit einer Mischung aus $concat Und $split Berechnet, da ein geeigneter String-Operator $replace Fehlt. Beachten Sie, wie URL direkt basierend auf dem eigenen Wert ($URL) Geändert wird.

  • Vergessen Sie nicht { multi: true }, Sonst wird nur das erste passende Dokument aktualisiert.

3
Xavier Guihot

Die Formatierung meines Kommentars für die ausgewählte Antwort (@ Naveeds Antwort) wurde verschlüsselt - also als Antwort. Alle Gutschriften gehen an Naveed.

-------------------------------------------------- --------------------

Einfach nur genial . Mein Fall war - ich habe ein Feld, das ein Array ist - also musste ich eine zusätzliche Schleife hinzufügen.

Meine Frage ist:

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));
})
2
Himel Nag Rana

Jetzt kannst du es schaffen!

Wir können das Mongo-Skript verwenden, um Daten im Handumdrehen zu bearbeiten. Für mich geht das!

Ich verwende dieses Skript, um meine Adressdaten zu korrigieren.

Beispiel für die aktuelle Adresse: "Nr.12, FÜNFTE VERLAUF".

Ich möchte das letzte redundante Komma entfernen, die erwartete neue Adresse "" Nr. 12, FÜNFTE VERLAUF ".

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!

1
Dac Nguyen

Falls Sie Beispiele aus den Antworten verwenden und "Ersetzen Sie 0 vorhandene Datensätze" bei der Ausführung Ihres Ersetzungsskripts verwenden, überprüfen Sie, ob Ihr Client mit dem primären MongoDB-Knoten verbunden ist, der das Speichern/Schreiben von Änderungen ermöglicht.

0

Mit Mongodump, Bsondump und Mongoimport.

Manchmal können die Mongodb-Sammlungen mit verschachtelten Arrays/Objekten usw. etwas komplexer werden, wenn es relativ schwierig ist, 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. Exportiere die Sammlung mit mongodump nach .bson

mongodump --db=<db_name> --collection=<products> --out=data/

2. Konvertieren Sie .bson mit bsondump in das .json-Format

bsondump --outFile products.json data/<db_name>/products.bson

. Ersetzen Sie die Zeichenfolgen in der .json-Datei durch sed (für Linux-Terminal) oder andere Tools

sed -i 's/oldstring/newstring/g' products.json

4. Importieren Sie die .json-Auflistung mit mongoimport mit --drop-Tag zurück, um sie vor dem Import zu entfernen.

mongoimport --db=<db_name>  --drop --collection products <products.json

Alternativ können Sie --uri für Verbindungen sowohl im Mongoimport als auch im Mongodump verwenden

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/
0
Ry Van