93

私はフォームのコレクションにたくさんのmongodbドキュメントを持っています:

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

に置き換えhelloWorldtたいhelloWorld

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

コレクション内のすべてのドキュメントでこれを実現するにはどうすればよいですか?

4

10 に答える 10

147
db.media.find({mediaContainer:"ContainerS3"}).forEach(function(e,i) {
    e.url=e.url.replace("//a.n.com","//b.n.com");
    db.media.save(e);
});
于 2015-07-07T07:50:17.680 に答える
62

現在、

  • start Mongo 4.2db.collection.updateMany(のエイリアスdb.collection.update)は集約パイプラインを受け入れることができ、最終的にはそれ自体の値に基づいてフィールドを更新できます。
  • を開始するMongo 4.4と、新しい集計演算子$replaceOneにより、文字列の一部を非常に簡単に置き換えることができます。
// { 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/ } })は一致クエリであり、更新するドキュメント(を含むドキュメント)をフィルタリングし"helloWorldt"、クエリを高速化するために存在します。
  • 2番目の部分($set: { URL: {...)は、更新集約パイプラインです(集約パイプラインの使用を示す角括弧に注意してください)。
    • $setは新しい集計演算子(Mongo 4.2)であり、この場合はフィールドの値を置き換えます。
    • 新しい値は、new$replaceOne演算子を使用して計算されます。URL自身の値()に基づいて直接変更される方法に注意してください$URL

Mongo 4.4開始する前Mongo 4.2に、適切な文字列$replace演算子がないため、とのbancalミックスを使用する必要が$concatあり$splitます。

db.collection.updateMany(
  { URL: { $regex: "/helloWorldt/" } },
  [{
    $set: { URL: {
      $concat: [
        { $arrayElemAt: [ { $split: [ "$URL", "/helloWorldt/" ] }, 0 ] },
        "/helloWorld/",
        { $arrayElemAt: [ { $split: [ "$URL", "/helloWorldt/" ] }, 1 ] }
      ]
    }}
  }]
)
于 2019-06-12T06:57:20.363 に答える
8

現在、フィールドの値を使用して更新することはできません。したがって、ドキュメントを反復処理し、関数を使用して各ドキュメントを更新する必要があります。これを行う方法の例をここに示します。MongoDB:同じドキュメントのデータを使用してドキュメントを更新する

于 2012-09-25T20:37:40.060 に答える
6

ドキュメント内のすべての部分文字列を置き換えるには、次を使用します。

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);
});
于 2018-08-14T17:31:41.793 に答える
6

mongodump、bsondump、mongoimportを使用します。

mongodbコレクションは、ネストされた配列/オブジェクトなどで少し複雑になることがあり、その周りにループを構築するのは比較的困難です。私の回避策はちょっと生っぽいですが、コレクションの複雑さに関係なく、ほとんどのシナリオで機能します。

1.mongodumpを使用してコレクションを.bsonにエクスポートします

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

2. bsondumpを使用して、.bsonを.json形式に変換します

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

3. .jsonファイルの文字列をsed(Linuxターミナルの場合)またはその他のツールに置き換えます

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

4.インポートする前にコレクションを削除する--dropタグを付けたmongoimportを使用して.jsonコレクションをインポートし直します

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

または、mongoimportとmongodumpの両方の接続に--uriを使用することもできます

mongodump --uri "mongodb://mongoadmin:mystrongpassword@10.148.0.7:27017,10.148.0.8:27017,10.148.0.9:27017/my-dbs?replicaSet=rs0&authSource=admin" --collection=products --out=data/
于 2019-04-02T04:30:22.153 に答える
5

nodejs。npmのmongodbパッケージを使用する

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});
  });
});
于 2016-07-25T18:42:08.120 に答える
4

選択した回答(@Naveedの回答)へのコメントのフォーマットがスクランブルされているため、これを回答として追加します。すべてのクレジットはNaveedに送られます。

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

ただ素晴らしい。私の場合は、配列であるフィールドがあるので、ループを追加する必要がありました。

私の質問は:

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));
})
于 2017-10-11T06:20:42.150 に答える
1

今、あなたはそれを行うことができます!

Mongoスクリプトを使用して、データをその場で操作できます。わたしにはできる!

このスクリプトを使用して、アドレスデータを修正します。

現在の住所の例:「No.12、FIFTHAVENUE」。

最後の冗長なカンマ、予想される新しいアドレス "" No.12、FIFTHAVENUE"を削除したいと思います。

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

  }
}

お役に立てれば!

于 2015-11-03T12:58:39.400 に答える
1

Regexこれは、メソッドの最初の部分でを使用して実行でき、その文字列replaceの[すべてgの正規表現パターン]オカレンスを2番目の文字列に置き換えます。これは、Javascriptの場合と同じ正規表現です。例:

const string = "www.abc.com/helloWorldt/...";
console.log(string);
var pattern = new RegExp(/helloWorldt/)
replacedString = string.replace(pattern, "helloWorld");
console.log(replacedString);

正規表現が文字列を置き換えているので、メソッドによって各要素を見つけて反復し、次のようにループforEach内に1つずつ保存することで、MongoDBシェルを簡単に実行できます。forEach

> 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/" }
>
于 2019-12-24T01:37:59.290 に答える
1

サブ文字列を検索して別の文字列に置き換える場合は、次のように試すことができます。

    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);
        }
    }) 
于 2020-07-09T08:31:16.147 に答える