programing

MongoDB의 기존 필드 끝에 문자열 추가

firstcheck 2023. 6. 22. 23:48
반응형

MongoDB의 기존 필드 끝에 문자열 추가

필드에 매우 긴 문자열이 있는 문서가 있습니다.필드에 이미 포함된 문자열의 끝에 다른 문자열을 연결해야 합니다.

제가 지금 하는 방법은 자바에서 문서를 가져와서 필드에서 문자열을 추출하고 문자열을 끝까지 추가한 다음 마지막으로 새로운 문자열로 문서를 업데이트하는 것입니다.

문제:필드에 포함된 문자열이 매우 길기 때문에 Java에서 이 문자열을 검색하고 작업하는 데 시간과 리소스가 필요합니다.게다가, 이것은 초당 여러 번 수행되는 작업입니다.

질문:가져올 필요 없이 문자열을 기존 필드에 연결할 수 있는 방법이 있습니까?db.<doc>.find()) 먼저 필드의 내용을 입력하시겠습니까?현실에서 내가 원하는 것은 (field.contents += new_string).

나는 이미 자바스크립트를 이용하여 이 작품을 만들었고,eval하지만 제가 알게 된 것처럼 MongoDB는 Javascript를 실행할 때 데이터베이스를 잠급니다. 이것은 전체 애플리케이션을 더 느리게 만듭니다.

시작하는Mongo 4.2집계db.collection.updateMany() 파이프라인을 수락하여 현재 값을 기준으로 필드를 업데이트할 수 있습니다.

// { a: "Hello" }
db.collection.updateMany(
  {},
  [{ $set: { a: { $concat: [ "$a", "World" ] } } }]
)
// { a: "HelloWorld" }
  • 첫 번째 파트{}업데이트할 문서(이 경우 모든 문서)를 필터링하는 일치 쿼리입니다.

  • 제2부[{ $set: { a: { $concat: [ "$a", "World" ] } } }]업데이트 집계 파이프라인입니다(집계 파이프라인 사용을 나타내는 대괄호 참조).$set (대신)$addFields)는 이 경우 필드 값을 대체하는 새로운 집계 연산자입니다(연결을 통해).a접미사가 붙은 그 자체"World". 방법을 참고합니다.a자체 값을 기준으로 직접 수정됩니다($a).

예를 들어, 다음과 같습니다(같은 이야기가 시작에 추가됩니다).

전에

"_id" : ObjectId("56993251e843bb7e0447829d"), "name" : "London City", "City" : "London" }

db.airports
   .find( { $text: { $search: "City" } })
   .forEach(
       function(e, i){ 
           e.name='Big ' + e.name; 
           db.airports.save(e);
       }
    )

이후:

"_id" : ObjectId("56993251e843bb7e0447829d"), "이름" : "빅 런던 시티", "시티" : "런던" }

오래된 주제지만 저도 같은 문제가 있었습니다.mongo 2.4부터 집계 프레임워크에서 $concat를 사용할 수 있습니다.

다음 문서를 고려합니다.

{
    "_id" : ObjectId("5941003d5e785b5c0b2ac78d"),
    "title" : "cov"
}

{
    "_id" : ObjectId("594109b45e785b5c0b2ac97d"),
    "title" : "fefe"
}

추가fefe로.title필드:

db.getCollection('test_append_string').aggregate(
    [
        { $project: { title: { $concat: [ "$title", "fefe"] } } }
    ]
)

집계 결과는 다음과 같습니다.

{
    "_id" : ObjectId("5941003d5e785b5c0b2ac78d"),
    "title" : "covfefe"
}

{
    "_id" : ObjectId("594109b45e785b5c0b2ac97d"),
    "title" : "fefefefe"
}

그런 다음 결과를 대량으로 저장할 수 있습니다. 이 답변을 참조하십시오.

이것은 제가 가지고 있는 하나의 문서의 샘플입니다.

{
    "_id" : 1,
    "s" : 1,
    "ser" : 2,
    "p" : "9919871172",
    "d" : ISODate("2018-05-30T05:00:38.057Z"),
    "per" : "10"
}

필드에 문자열을 추가하려면 모든 문서에 대해 각 루프를 실행한 다음 원하는 필드를 업데이트할 수 있습니다.

db.getCollection('jafar').find({}).forEach(function(el){
    db.getCollection('jafar').update(
        {p:el.p},
        {$set:{p:'98'+el.p}})    
    })

이것은 불가능합니다.한 가지 최적화 방법은 업데이트 배치를 만드는 것입니다. 즉, 10K 문서를 가져오고 각 키에 관련 문자열을 추가한 다음 단일 배치로 저장합니다.대부분의 mongodb 드라이버는 배치 작업을 지원합니다.

db.getCollection('<collection>').update(
    // query 
    {},

    // update 
    {
        $set: {<field>:this.<field>+"<new string>"}
    },

    // options 
    {
        "multi" : true,  // update only one document 
        "upsert" : false  // insert a new document, if no existing document match the query 
    });

언급URL : https://stackoverflow.com/questions/23868963/append-a-string-to-the-end-of-an-existing-field-in-mongodb

반응형