mongodb 문서에서 부분 문자열을 바꾸는 방법
다음과 같은 형식의 모음에 mongodb 문서가 많이 있습니다.
{
....
"URL":"www.abc.com/helloWorldt/..."
.....
}
나는 대체 할 helloWorldt
함께 helloWorld
얻을 수 있습니다 :
{
....
"URL":"www.abc.com/helloWorld/..."
.....
}
내 컬렉션의 모든 문서에 대해 어떻게이 작업을 수행 할 수 있습니까?
db.media.find({mediaContainer:"ContainerS3"}).forEach(function(e,i) {
e.url=e.url.replace("//a.n.com","//b.n.com");
db.media.save(e);
});
현재는 필드 값을 사용하여 업데이트 할 수 없습니다. 따라서 문서를 반복하고 함수를 사용하여 각 문서를 업데이트해야합니다. 여기에 어떻게 할 수 있는지에 대한 예가 있습니다. MongoDB : 동일한 문서의 데이터를 사용하여 문서 업데이트
시작 Mongo 4.2
, db.collection.update()
마지막으로 다른 필드를 기준으로 필드의 업데이트를 허용 집계 파이프 라인을 받아 들일 수 있습니다 :
// { 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/..." }
$replace
아직 적절한 문자열 연산자 가 없기 때문에 이것은 약간 장황 합니다.
첫 번째 부분
{ URL: { $regex: "/helloWorldt/" } }
은 업데이트 할 문서 (hello world의 철자가 틀린 문서)를 필터링하는 일치 쿼리입니다.두 번째 부분
[{ $set: { URL: ... } }]
은 업데이트 집계 파이프 라인입니다 (집계 파이프 라인의 사용을 나타내는 대괄호 참조).$set
이 경우 필드를 생성 / 교체하는 새로운 집계 연산자입니다. 새로운 값은 적절한 문자열 연산자 의 조합$concat
과$split
부족으로 이상하게 계산됩니다$replace
.URL
자체 값 ($URL
)을 기반으로 직접 수정되는 방법 에 유의하십시오 .잊지 마세요
{ multi: true }
. 그렇지 않으면 일치하는 첫 번째 문서 만 업데이트됩니다.
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});
});
});
문서에서 모든 부분 문자열 을 바꾸려면 다음을 사용하십시오.
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);
});
The formatting of my comment to the selected answer (@Naveed's answer) has got scrambled - so adding this as an answer. All credit goes to Naveed.
----------------------------------------------------------------------
Just awesome. My case was - I have a field which is an array - so I had to add an extra loop.
My query is:
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));
})
Now you can do it!
We can use Mongo script to manipulate data on the fly. It works for me!
I use this script to correct my address data.
Example of current address: "No.12, FIFTH AVENUE,".
I want to remove the last redundant comma, the expected new address ""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);
}
}
Hope this helps!
Just in case if you are using examples from the answers here and get "Updated 0 existing records" when running your replace script, check whether your client is connected to the primary MongoDB node that allows you to store/write changes.
Using mongodump,bsondump and mongoimport.
Sometimes the mongodb collections can get little complex with nested arrays/objects etc where it would be relatively difficult to build loops around them. My work around is kinda raw but works in most scenarios regardless of complexity of the collection.
1. Export The collection using mongodump into .bson
mongodump --db=<db_name> --collection=<products> --out=data/
2. Convert .bson into .json format using bsondump
bsondump --outFile products.json data/<db_name>/products.bson
3. Replace the strings in the .json file with sed(for linux terminal) or with any other tools
sed -i 's/oldstring/newstring/g' products.json
4. Import back the .json collection with mongoimport with --drop tag where it would remove the collection before importing
mongoimport --db=<db_name> --drop --collection products <products.json
Alternatively you can use --uri for connections in both mongoimport and mongodump
example
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/
ReferenceURL : https://stackoverflow.com/questions/12589792/how-to-replace-substring-in-mongodb-document
'IT박스' 카테고리의 다른 글
서명 계산을위한 HMAC-SHA256 알고리즘 (0) | 2020.12.15 |
---|---|
yield를 사용한 재귀 (0) | 2020.12.15 |
공백으로 경로를 입력하는 방법은 무엇입니까? (0) | 2020.12.15 |
Spring @Scheduled 주석이 달린 메소드는 다른 스레드에서 실행됩니까? (0) | 2020.12.15 |
Android 앱을 기기에 업로드 할 수 없음 (오래된 dexed jar) (0) | 2020.12.15 |