2016-11-02 2 views
0

Mongoose 및 MongoDB를 처음 사용하고 중첩 된 배열에있는 필드 값을 업데이트해야하는 시나리오를 구현하려고합니다. 나는이 프런트 엔드에서 선택 될 때마다 특정 옵션의 표를 증가 할 필요가Mongoose - 중첩 된 배열의 필드 값 늘리기

{ 
    "_id" : ObjectId("581999ecf97860b77c1625f6"),  // this is userID 
    "username" : "test", 
    "__v" : 0, 
    "polls" : [ 
      { 
        "url" : "xxxx", 
        "question" : "city or united", 
        "_id" : ObjectId("581999ec3ba2b15ad7fbcd50"), //this is questionID 
        "option" : [ 
          { 
            "votes" : 0, 
            "value" : "city", 
            "_id" : ObjectId("581999ec3ba2b15ad7fbcd52") //this is optionID 
          }, 
          { 
            "votes" : 0, 
            "value" : "united", 
            "_id" : ObjectId("581999ec3ba2b15ad7fbcd51") //this is optionID 
          } 
        ] 
      }, 
      { 
        "url" : "yyyy", 
        "question" : "chelsea or arsenal", 
        "_id" : ObjectId("58199d0ef11835685d3f41b7"), 
        "option" : [ 
          { 
            "votes" : 0, 
            "value" : "chelsea", 
            "_id" : ObjectId("58199d0ef11835685d3f41b9") 
          }, 
          { 
            "votes" : 0, 
            "value" : "arsenal", 
            "_id" : ObjectId("58199d0ef11835685d3f41b8") 
          } 
        ] 
      } 
    ] 
} 

다음과 같이

예를 들어, 내 DB 항목입니다.

다음은 지금까지 구현하려고 시도했지만 성공하지 못한 것입니다. 내가 여기 잘못하고있어 뭔가

var PollsSchema = new Schema({ 
username: String, 
polls: [ 
    { 
     question: String, 
     option: [ 
      { 
       value: String, 
       votes: Number 
      } 
     ], 
     url: String 
    } 
] 
}); 

있습니까 : 아래

PollsSchema.methods.submitVote = function(id, callback){ 
var increment = { $inc: { 'polls.option.$.votes': 1 } }; 
var query = { 
    '_id': id.userID, 
    'polls._id': id.questionID, 
    'polls.option._id': id.optionID 
}; 

return this.model('Poll').update(query, increment, callback); 
}; 

내 스키마입니까?

시간 내 제안과 제안에 감사드립니다.

+0

MongoDB의 알려진 문제입니다. 이미 열려있는 버그가 있습니다 https://jira.mongodb.org/browse/SERVER-831 –

+0

[Mongo에서 2 레벨 계층 구조가있는 위치 연산자 사용] 가능한 복제본 (http://stackoverflow.com/questions/5038983/) using-position-operator-with two-level-hierarchies-in-mongo) –

답변

1

중첩 된 배열 자리 표시자를 대체 할 수없는 Mongo db 제한이 있습니다. 위치 연산자는 한 수준에서만 사용할 수 있습니다. 설문 조사에서 설문 조사와 같은 질문을 업데이트한다면 잘 될 것입니다. 또한 mongo db는 투표와 같은 여러 자리 표시자를 지원하지 않습니다. $. option. $. votes.

댓글에서 지적한대로 jira 결함을 볼 수 있습니다. 이제 해결 방법을 찾으십시오.

옵션을 병합하면 폴링 안에 포함 할 수 있습니다. 아래에서 이와 같은 것입니다. 질문과 옵션에 대한 고유 ID가있는 한 항상 고유 레코드로 해석 할 수 있어야합니다.

{ 
    "_id": ObjectId("581999ecf97860b77c1625f6"), // this is userID 
    "username": "test", 
    "__v": 0, 
    "polls": [{ 
     "url": "xxxx", 
     "question": "city or united", 
     "_id": ObjectId("581999ec3ba2b15ad7fbcd50"), //this is questionID 
     "votes": 0, 
     "value": "city", 
     "option_id": ObjectId("581999ec3ba2b15ad7fbcd52") //this is optionID 
    }, { 
     "url": "xxxx", 
     "question": "city or united", 
     "_id": ObjectId("581999ec3ba2b15ad7fbcd50"), //this is questionID 
     "votes": 0, 
     "value": "united", 
     "option_id": ObjectId("581999ec3ba2b15ad7fbcd51") //this is optionID 
    }] 
} 

이제 투표 수를 늘릴 수 있습니다.

PollsSchema.methods.submitVote = function(id, callback) { 
    var increment = { 
     $inc: { 
      'polls.$.votes': 1 
     } 
    }; 
    var query = { 
     '_id': id.userID, 
     'polls._id': id.questionID, 
     'polls.option_id': id.optionID 
    }; 

    return this.model('Poll').update(query, increment, callback); 
}; 

다른 옵션은 집계 파이프 라인을 사용하여 항목을 찾은 다음 반환 된 개체를 업데이트하는 것입니다.

+0

응답 해 주셔서 감사합니다. 나는 스키마를 한꺼번에 재구성 할 것이다. 그러나 당분간 나는 questionID에 의해 설문 조사를 찾은 다음 옵션에 대한 루프를 실행하고 option._id가 frontend에서 전달 된 optionID와 일치하면 투표를 증가시키는 해결 방법을 사용했습니다. 그런 다음 save()를 사용하여 DB에 다시 기록합니다. –