복붙노트

[MONGODB] MongoDB를 가진 중첩 된 배열을 업데이트

MONGODB

MongoDB를 가진 중첩 된 배열을 업데이트

나는 중첩 된 배열의 값을 업데이트하려고하지만 일에 그것을 얻을 수 없습니다.

내 목적은 다음과 같이이다

 {
    "_id": {
        "$oid": "1"
    },
    "array1": [
        {
            "_id": "12",
            "array2": [
                  {
                      "_id": "123",
                      "answeredBy": [],
                  },
                  {
                      "_id": "124",
                      "answeredBy": [],
                  }
             ],
         }
     ]
 }

나는 "answeredBy"배열에 값을 밀어해야합니다.

아래의 예에서, 나는 "123 _id"개체의 "answeredBy"배열에 밀어 "성공"문자열을 시도했지만이 일을하지 않습니다.

callback = function(err,value){
     if(err){
         res.send(err);
     }else{
         res.send(value);
     }
};
conditions = {
    "_id": 1,
    "array1._id": 12,
    "array2._id": 123
  };
updates = {
   $push: {
     "array2.$.answeredBy": "success"
   }
};
options = {
  upsert: true
};
Model.update(conditions, updates, options, callback);

나는이 링크를 찾았지만, 그 대답은 내가 구조 대신 배열의 같은 객체를 사용한다고 말했습니다. 이것은 나의 상황에 적용 할 수 없습니다. 난 정말 내 객체가 배열에 중첩 될 필요가

당신이 나를 도울 수 있다면 그것은 좋은 것입니다. 나는 이것을 알아 내기 위해 시간을 소비했습니다.

사전에 감사합니다!

해결법

  1. ==============================

    1.당신이 여기에서 무엇을하고 있는지 문제 몇 가지가있다. 첫째 쿼리 조건. 당신은 당신이 필요가 없습니다 여러 _id 값을 참조하고, 중 적어도 하나는 최상위에 있지 않습니다.

    당신이 여기에서 무엇을하고 있는지 문제 몇 가지가있다. 첫째 쿼리 조건. 당신은 당신이 필요가 없습니다 여러 _id 값을 참조하고, 중 적어도 하나는 최상위에 있지 않습니다.

    는 "중첩"값에 들어가서도 _id 값이 고유하고 다른 문서에 나타나지 않을 것이라는 점을 추정하기 위해, 당신은 쿼리 형식은 다음과 같이해야합니다 :

    Model.update(
        { "array1.array2._id": "123" },
        { "$push": { "array1.0.array2.$.answeredBy": "success" } },
        function(err,numAffected) {
           // something with the result in here
        }
    );
    

    이제 실제로 작품은,하지만 정말 아주 좋은 이유가로가하는 단지 우연은 왜 당신을 위해 일해서는 안됩니다.

    중요한 독서는 "중첩 된 배열"의 주제 아래에 위치 $ 연산자에 대한 공식 문서입니다. 이것이 말하는 것은 :

    구체적으로는 어떤 것을 의미하는 매칭 및 제 정합 어레이에서 인덱스 값 위치 지정자에 반환되는 원소이다. 귀하의 경우이 수단 '최고'수준의 배열에 일치하는 인덱스입니다.

    당신이 그림과 같이 쿼리 표기를 보면 그래서, 우리는 최상위 배열의 첫 번째 (0 인덱스) 위치를 "하드 코딩"있고, 그냥 그렇게 "array2는"내에서 일치하는 요소는 제로 인덱스 항목입니다 발생합니다.

    이를 설명하기 위해 당신은 "124"에 일치하는 _id 값을 변경할 수 있습니다 그들은 모두 "하는 array1"의 제로 인덱스 항목에있는대로 결과가 "123"_id를 가진 요소 끌어다 새 항목을 밀어 $하고 그 반환 된 값입니다 자리 표시 자합니다.

    그래서 중첩 배열로 일반적인 문제입니다. 당신은 레벨 중 하나를 제거 할 수 있습니다 그리고 당신은 여전히 ​​"정상"배열의 올바른 요소에 밀어 $ 할 수있을 것입니다,하지만 여전히 여러 수준이있을 것입니다.

    표시되는대로 업데이트 문제로 실행됩니다으로 중첩 배열을 피하십시오.

    일반적인 경우가있다 최종 세부 항목에 논문 "속성"을 만들 실제로 당신이 "생각"하는 일이 "수준"이다 "결합"합니다. 예를 들어, 문제의 구조의 형태는 같은 것을해야한다 "평평"

     {
       "answers": [
         { "by": "success", "type2": "123", "type1": "12" }
       ]
     }
    

    또는 내부 배열을 받아들이는 경우에도 만 업데이트되지, 결코 $ 푸시입니다 :

     {
       "array": [
         { "type1": "12", "type2": "123", "answeredBy": ["success"] },
         { "type1": "12", "type2": "124", "answeredBy": [] }
       ]
     }
    

    둘 다 위치 $ 연산자의 범위 내에서의 원자 갱신에 자신을 빌려 어떤

    MongoDB를 3.6에서 중첩 배열로 작업에 사용할 수 새로운 기능이 있습니다. 이 사용 위치 여과 $ [<식별자>] 구 업데이트 명령문 arrayFilters 통해 다른 조건을 특정 요소와 일치하고 적용하기 위하여 :

    Model.update(
      {
        "_id": 1,
        "array1": {
          "$elemMatch": {
            "_id": "12","array2._id": "123"
          }
        }
      },
      {
        "$push": { "array1.$[outer].array2.$[inner].answeredBy": "success" }
      },
      {
        "arrayFilters": [{ "outer._id": "12" },{ "inner._id": "123" }] 
      }
    )
    

    (.update를위한 옵션에 전달) 또는 같이 "arrayFilters" .updateOne () .updateMany () .findOneAndUpdate () 또는 .bulkWrite () 메소드를 지정 조건은 갱신 명령에 주어진 식별자하였습니다. 주어진 조건과 일치하는 요소가 업데이트됩니다.

    구조는 "중첩"되어 있기 때문에, 실제로는 도시 한 바와 같이 필터 정의의 "어레이"로 지정되는 바와 같이 "다중 필터"를 사용한다. 표시된 "식별자"위치 여과 $ [<식별자>] 구 실제로 명령문의 갱신 블록에 대해 이용 매칭에 사용된다. 이 경우, 내측 및 외측 중첩 사슬로 지정된 각 조건에 사용되는 식별자이다.

    이 새로운 확장 가능한 중첩 된 배열 내용의 업데이트를 만들지 만, 같은주의가 아니라 앞에서 설명한 적용 그래서, "쿼리"이러한 데이터의 실용성 정말 도움이되지 않습니다.

    당신은 일반적으로 정말 "평균"그냥 일반적으로는 "이전의 관계 부분은"함께 모여 생각하는 방법에 대한 반응이다, 당신의 두뇌는 처음 "중첩"생각하는 경우에도, "속성"로 표현합니다. 현실에서 당신은 정말 더 비정규이 필요합니다.

    또한이 새로운 업데이트 운영자가 실제로 오히려 위치 업데이트의 이전 작업 된 단지 처음보다 일치와 갱신 "여러 배열 요소"이후, MongoDB를에서 다중 배열 요소를 업데이트하는 방법을 참조하십시오.

    참고 또한 업데이트 "다수의 배열 요소"그러나 특정 조건에 적용하지 않고 해당 원하는 액션 인 어레이의 모든 요소들에 적용되는 모든 $를 [] 위치.

  2. ==============================

    2.나는 이것이 아주 오래된 질문 알지만, 난 그냥이 문제를 자신 고투, 나는 더 나은 해답이 될 생각하는 것을 발견했다.

    나는 이것이 아주 오래된 질문 알지만, 난 그냥이 문제를 자신 고투, 나는 더 나은 해답이 될 생각하는 것을 발견했다.

    이 문제를 해결하기위한 방법은 하위 문서를 사용하는 것입니다. 이것은 당신의 스키마 내에서 중첩 스키마에 의해 이루어집니다

    MainSchema = new mongoose.Schema({
       array1: [Array1Schema]
    })
    
    Array1Schema = new mongoose.Schema({
       array2: [Array2Schema]
    })
    
    Array2Schema = new mongoose.Schema({
       answeredBy": [...]
    })
    

    개체가 당신이 보여 하나,하지만 지금은 각 배열 모양을 이런 식으로 하위 문서로 채워져있다. 이로써 원하는 하위 문서에 길을 점 할 수 있습니다. 대신 .update를를 사용하는 당신은 다음 업데이트 할 문서를 얻기 위해 .find 또는 .findOne를 사용합니다.

    Main.findOne((
        {
            _id: 1
        }
    )
    .exec(
        function(err, result){
            result.array1.id(12).array2.id(123).answeredBy.push('success')
            result.save(function(err){
                console.log(result)
            });
        }
    )
    

    구문이 맞지 않을 수 있도록 .push () 함수를 이런 식으로 자신을 사용하지 않은,하지만 난 둘은 .set () 및 .remove (), 그리고 완벽하게 정상적으로 모두 작품을 사용했다.

  3. from https://stackoverflow.com/questions/23577123/updating-a-nested-array-with-mongodb by cc-by-sa and MIT license