복붙노트

[MONGODB] 하여 MongoDB : 너무 많은 위치 (즉 '$') 요소로 발견

MONGODB

하여 MongoDB : 너무 많은 위치 (즉 '$') 요소로 발견

난 그냥 몽고 2.6.1 및 이전 작업 된 오류를 반환하지 않습니다 하나의 업데이트 문으로 업그레이드. 업데이트 문은 다음과 같습니다

db.post.update( { 'answers.comments.name': 'jeff' },
    { '$set': {
        'answers.$.comments.$.name': 'joe'
    }},
    { multi: true }
)

오류 I get 및입니다 :

WriteResult({
    "nMatched" : 0,
    "nUpserted" : 0,
    "nModified" : 0,
    "writeError" : {
        "code" : 2,
        "errmsg" : "Too many positional (i.e. '$') elements found in path 'answers.$.comments.$.createUsername'"
    }
})

내가 요소를 한 수준 깊은 대신이 업데이트 할 때 (즉, 답변을. $. 대신 답변의 이름을 지정합니다. $. 의견. $. 이름), 그것을 잘 작동합니다. 나는 2.6 이하 내 몽고 인스턴스를 다운 그레이드 할 경우, 그것은 또한 잘 작동합니다.

해결법

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

    1.위치 연산자 조회 한 번만 사용될 수있다. 이것은 개선을위한 오픈 티켓이, 제한 사항입니다 : https://jira.mongodb.org/browse/SERVER-831

    위치 연산자 조회 한 번만 사용될 수있다. 이것은 개선을위한 오픈 티켓이, 제한 사항입니다 : https://jira.mongodb.org/browse/SERVER-831

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

    2.말한 바와 같이; 하나 개 이상의 위치 요소는 현재 지원되지 않습니다. 당신은 MongoDB의의 cursor.forEach () 메소드를 업데이트 할 수 있습니다.

    말한 바와 같이; 하나 개 이상의 위치 요소는 현재 지원되지 않습니다. 당신은 MongoDB의의 cursor.forEach () 메소드를 업데이트 할 수 있습니다.

    db.post
      .find({"answers.comments.name": "jeff"})
      .forEach(function(post) {
        if (post.answers) {
          post.answers.forEach(function(answer) {
            if (answer.comments) {
              answer.comments.forEach(function(comment) {
                if (comment.name === "jeff") {
                  comment.name = "joe";
                }
              });
            }
          });
    
          db.post.save(post);
        }
      });
    
  3. ==============================

    3.당신은이 작업을 수행 할 수 있습니다, 당신은 단지 몽고 3.6이 필요 해요! 대신 데이터베이스를 재 설계, 당신은 여기에서 찾을 수 있습니다 몽고 3.6의 배열 필터 기능을 사용할 수 있습니다 :

    당신은이 작업을 수행 할 수 있습니다, 당신은 단지 몽고 3.6이 필요 해요! 대신 데이터베이스를 재 설계, 당신은 여기에서 찾을 수 있습니다 몽고 3.6의 배열 필터 기능을 사용할 수 있습니다 :

    https://thecodebarbarian.com/a-nodejs-perspective-on-mongodb-36-array-filters

    이것의 아름다움은 변수에 배열에 모든 일치를 결합하고 나중에 변수를 참조 할 수 있다는 것입니다. 다음은 위의 링크에서 좋은 예이다 :

  4. ==============================

    4.나는 배열 업데이트 내부 배열에 필요한만큼 성능에 미치는 영향에 대해 같은 문제에 직면했다. 그래서, MongoDB를가이를 지원하지 않습니다. 아래에 주어진 링크에서와 같이 데이터베이스를 재 설계.

    나는 배열 업데이트 내부 배열에 필요한만큼 성능에 미치는 영향에 대해 같은 문제에 직면했다. 그래서, MongoDB를가이를 지원하지 않습니다. 아래에 주어진 링크에서와 같이 데이터베이스를 재 설계.

    https://pythonolyk.wordpress.com/2016/01/17/mongodb-update-nested-array-using-positional-operator/

  5. ==============================

    5.사용 arrayFilters.

    사용 arrayFilters.

    우리가 scenario-을 가정 해 봅시다

    "access": {
        "projects": [{
            "projectId": ObjectId(...),
            "milestones": [{
                "milestoneId": ObjectId(...),
                "pulses": [{
                    "pulseId": ObjectId(...)
                }]
            }]
        }]
    }
    

    이제 프로젝트 내부에 존재하는 이정표에 펄스를 추가하려면

    db.users.updateOne({
        "_id": ObjectId(userId)
    }, {
        "$push": {
            "access.projects.$[i].milestones.$[j].pulses": ObjectId(pulseId)
        }
    }, {
        arrayFilters: [{
            "i.projectId": ObjectId(projectId)
        }, {
            "j.milestoneId": ObjectId(milestoneId)
        }]
    })
    

    PyMongo를 들어, 사용 arrayFilters this- 같은

    db.users.update_one({
        "_id": ObjectId(userId)
    }, {
        "$push": {
            "access.projects.$[i].milestones.$[j].pulses": ObjectId(pulseId)
        }
    }, array_filters = [{
            "i.projectId": ObjectId(projectId)
    }, {
            "j.milestoneId": ObjectId(milestoneId)
    }])
    

    또한,

    https://jira.mongodb.org/browse/SERVER-831

  6. ==============================

    6.

    db.post.update( { 'answers.comments.name': 'jeff' },
        { '$set': {
            'answers.$.comments.$.name': 'joe'
        }},
        { multi: true }
    )
    

    답변입니다

    db.post.update( { 'answers.comments.name': 'jeff' },
        { '$set': {
            'answers.0.comments.1.name': 'joe'
        }},
        { multi: true }
    )
    
  7. from https://stackoverflow.com/questions/24046470/mongodb-too-many-positional-i-e-elements-found-in-path by cc-by-sa and MIT license