programing

MongoDB는 두 필드의 문자열을 세 번째 필드로 연결합니다.

goodsources 2023. 7. 15. 10:05
반응형

MongoDB는 두 필드의 문자열을 세 번째 필드로 연결합니다.

두 문자열 필드의 값을 연결하여 세 번째 문자열 필드에 넣으려면 어떻게 해야 합니까?

시도해 본 적이 있습니다.

db.collection.update(
  { "_id": { $exists: true } },
  { $set: { column_2: { $add: ['$column_4', '$column_3'] } } },
  false, true
)

하지만 효과가 없는 것처럼 보이고, 던져집니다.not ok for storage.

저도 해봤어요.

db.collection.update(
  { "_id": { $exists : true } },
  { $set: { column_2: { $add: ['a', 'b'] } } },
  false, true
)

하지만 이것조차도 같은 오류를 보여줍니다.not ok for storage.

나는 내 애플리케이션이 아닌 몽고 서버에서만 연결하고 싶습니다.

집계 연산자 및 :

db.collection.aggregate([
  { $project: { newfield: { $concat: [ "$field1", " - ", "$field2" ] } } }
])

유감스럽게도 MongoDB는 현재 업데이트()를 수행할 때 필드의 기존 값을 참조할 수 없습니다.이 기능을 추가할 수 있는 기존 Jira 티켓이 있습니다. 자세한 내용은 SERVER-1765를 참조하십시오.

현재는 기존 값을 확인하기 위해 초기 쿼리를 수행하고 클라이언트에서 문자열 조작을 수행해야 합니다.제가 당신에게 더 나은 대답을 해줬으면 좋겠어요.

업데이트 시 집계 파이프라인을 지원하는 4.2에서 이와 같이 사용할 수 있습니다.

db.collection.update(
   {"_id" :{"$exists":true}},
   [{"$set":{"column_2":{"$concat":["$column_4","$column_3"]}}}]
)

@Jamby가 제안한 @rebe100x의 답변을 기반으로 합니다.

집계 파이프라인에서 $project, $concat 및 $out(또는 $merge)을 사용할 수 있습니다.https://docs.mongodb.org/v3.0/reference/operator/aggregation/project/ https://docs.mongodb.org/manual/reference/operator/aggregation/concat/ https://docs.mongodb.com/manual/reference/operator/aggregation/out/

예:

    db.collection.aggregate(
       [
          { $project: { newfield: { $concat: [ "$field1", " - ", "$field2" ] } } },
          { $out: "collection" }
       ]
    )

MongoDB 4.2를 사용하여 .

MongoDB 4.2는 $merge pipeline stage를 추가하여 컬렉션 내에서 선택적으로 문서를 대체하고 $out은 전체 컬렉션을 대체합니다.또한 대상 문서를 대체하는 대신 병합할 수도 있습니다.

    db.collection.aggregate(
       [
          { $project: { newfield: { $concat: [ "$field1", " - ", "$field2" ] } } },
          { $merge: { into: "collection", on: "_id", whenMatched: "merge", whenNotMatched: "discard" }
       ]
    )

$out은 임시 수집 및 이름 변경을 통해 수집 대체를 자동으로 수행하므로 $merge와 $out 사이에서 성능, 동시성 및 일관성 간의 균형을 고려해야 합니다.

https://docs.mongodb.com/manual/reference/operator/aggregation/merge/ https://docs.mongodb.com/manual/reference/operator/aggregation/merge/ #편집자주

**

나의 경우 이것은$concat저를 위해 일했습니다...

**

db.collection.update( { "_id" : {"$exists":true} }, 
   [ { 
       "$set" : { 
                 "column_2" :  { "$concat" : ["$column_4","$column_3"] }
                }
      }
   ]

컬렉션 이름이 "myData"라고 가정하고 이와 같은 데이터가 있다고 가정합니다.

{
"_id":"xvradt5gtg",
"first_name":"nizam",
"last_name":"khan",
"address":"H-148, Near Hero Show Room, Shahjahanpur",
}

필드(first_name+last_name+address)를 연결하여 다음과 같이 "address" 필드에 저장합니다.

{
"_id":"xvradt5gtg",
"first_name":"nizam",
"last_name":"khan",
"address":"nizam khan,H-148, Near Hero Show Room, Shahjahanpur",
}

이제 쓰기 쿼리는

{
var x=db.myData.find({_id:"xvradt5gtg"});
x.forEach(function(d)
    { 
        var first_name=d.first_name;
        var last_name=d.last_name;
        var _add=d.address;  
        var fullAddress=first_name+","+last_name+","+_add; 
        //you can print also
        print(fullAddress); 
        //update 
        db.myData.update({_id:d._id},{$set:{address:fullAddress}});
    })
}

다음과 같이 수행할 수도 있습니다.

db.collectionName.find({}).forEach(function(row) { 
    row.newField = row.field1 + "-" + row.field2
    db.collectionName.save(row);
});

루프에 사용하여 각 찾기 및 업데이트

  1. 사용:

    db.getCollection('users').find({ }).forEach( function(user) {
        user.full_name = user.first_name + " " + user.last_name;
        db.getCollection('users').save(user);
    });
    
  2. 또는 사용해 보십시오.

    db.getCollection('users').find({ }).forEach( function(user) {
        db.getCollection('users').update(
            { _id: user._id },
            { $set: { "full_name": user.first_name + " " + user.last_name } }
        )
    });
    

언급URL : https://stackoverflow.com/questions/12820253/mongodb-concatenate-strings-from-two-fields-into-a-third-field

반응형