1

내가 같은 스키마를 가지고 : 당신이 선택이 subdocs 작동하지 않습니다시피몽구스 선택 subdoc 필드

mongoose.model "Ticket", { 
    title: String 
    body: String 
    likes: Number 
    comments: [{ 
    body: String 
    upvotes: Number 
    downvotes: Number 
    }] 
} 

내 코드가

q = @model.findOne {"comments._id": oid}, {"comments.$": 1} 

q.select "comments.upvotes" 
q.exec (err, result) => 
    console.log(result.comment[0].downvotes) # 6 

를 조회하기를, 그것도하지 선택한 필드를 반환 . 그것을 고치는 방법?

답변

2

MongoDB가 배열 요소로 기본 투영을 처리하는 방법입니다. 이 같은 것을 할 수 있지만 :

Model.findOne({}, { "comments.upvotes": 1 },function(err,doc) { 

}) 

을 그리고 그냥 조건과 일치하는 모든 문서는 물론 모든 배열 요소에 대한 코멘트 배열의 하위 문서 내에서 "upvotes"필드를 반환 당신은 할 수 없습니다 이것을 positional $ 연산자를 사용하여 선택된 위치 투영과 결합하십시오. 이것은 기본적으로 "이론"에서 유래합니다. 일반적으로 실제로 배열 전체를 반환하려고합니다. 따라서 이것이 항상 효과가 있었고 곧 바뀔 것 같지 않습니다.

원하는 것을 얻으려면 aggregation framework에서 제공하는 문서 조작을위한 확장 기능이 필요합니다. 2.6 이후 MongoDB에의

Model.aggregate(
    [ 
     // Match the document containing the array element 
     { "$match": { "comments._id" : oid } }, 

     // Unwind to "de-normalize" the array content 
     { "$unwind": "$comments" }, 

     // Match the specific array element 
     { "$match": { "comments._id" : oid } }, 

     // Group back and just return the "upvotes" field 
     { "$group": { 
      "_id": "$_id", 
      "comments": { "$push": { "upvotes": "$comments.upvotes" } } 
     }} 
    ], 
    function(err,docs) { 


    } 
); 

또는 현대적인 버전 당신도이 작업을 수행 할 수 있습니다 :

Model.aggregate(
    [ 
     { "$match": { "comments._id" : oid } }, 
     { "$project": { 
      "comments": { 
       "$setDifference": [ 
        { "$map": { 
         "input": "$comments", 
         "as": "el", 
         "in": { 
          "$cond": [ 
           { "$eq": [ "$$el._id", oid ] }, 
           { "upvotes": "$$el.upvotes" }, 
           false 
          ] 
         } 
        }}, 
        [false] 
       ] 
      }} 
     }} 
    ], 
    function(err,docs) { 

    } 
) 

을 그리고 그 수행 할 $map$setDifference 연산자를 사용 이렇게하면 문서를 반환하는 방법을 세밀하게 제어 할 수 $unwind 스테이지를 먼저 처리하지 않고 배열 내용을 "인라인"필터링합니다.

문서가 반환되는 방식을보다 잘 제어하려면 포함 된 문서로 작업 할 때 집계 프레임 워크가이를 수행하는 방법입니다.

+0

재미있을 것 같습니다. 감사 – Vinz243