2017-09-07 5 views
0

먼저 mongodb을 처음 사용한다고 가정 해 보겠습니다. 내가 컬렉션 여기 에서 데이터를 얻기 위해 시도하고 내 컬렉션 학생의 문서입니다 :mongodb를 사용하여 제한 및 오프셋이있는 객체의 배열을 가져 오지 못함

{ 
    "_id" : ObjectId("5979e0473f00003717a9bd62"), 
    "id" : "l_7c0e37b9-132e-4054-adbf-649dbc29f43d", 
    "name" : "Raj", 
    "class" : "10th", 
    "assignments" : [ 
     { 
      "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc571", 
      "name" : "1" 
     }, 
     { 
      "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc572", 
      "name" : "2" 
     }, 
     { 
      "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc573", 
      "name" : "3" 
     }, 
     { 
      "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc574", 
      "name" : "4" 
     }, 
     { 
      "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc575", 
      "name" : "5" 
     }, 
     { 
      "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc576", 
      "name" : "6" 
     } 
    ] 
} 

내가 필요로 출력이 난 다음 쿼리를 사용하여이 응답에 대한

{ 
    "assignments" : [ 
      { 
       "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc571", 
       "name" : "1" 
      }, 
      { 
       "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc572", 
       "name" : "2" 
      }, 
      { 
       "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc573", 
       "name" : "3" 
      }, 
      { 
       "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc574", 
       "name" : "4" 
      }, 
      { 
       "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc575", 
       "name" : "5" 
      }, 
      { 
       "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc576", 
       "name" : "6" 
      } 
     ] 
} 

입니다

db.getCollection('student').find({},{"assignments":1}) 

정확히 내가 시도한 것은 $slice:[0,3]으로 시도한 댓글 목록에 대해 한도와 오프셋을 적용하는 것이지만 전체 문서를 제공합니다. 슬라이스 된 결과는 이지만 할당만으로는 할당되지 않으므로 한계와 오프셋이있는 할당 만 얻으려면이 두 가지를 어떻게 조합해야합니까?

답변

1

aggregate은 (는) + 슬라이스를 허용하기 때문에 find 대신 aggregate이 필요합니다. 귀하의 질문에, 다음 명령에서 문서 감안할 때

...

db.getCollection('student').aggregate([ 
    // project on assignments and apply a slice to the projection 
    {$project: {assignments: {$slice: ['$assignments', 2, 5]}}} 
]) 

... 수익률 :

{ 
    "_id" : ObjectId("5979e0473f00003717a9bd62"), 
    "assignments" : [ 
     { 
      "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc573", 
      "name" : "3" 
     }, 
     { 
      "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc574", 
      "name" : "4" 
     }, 
     { 
      "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc575", 
      "name" : "5" 
     }, 
     { 
      "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc576", 
      "name" : "6" 
     } 
    ] 
} 

이는 assignments 배열을 나타냅니다 (그리고 assignments 배열) 위의 예에서 슬라이스 인수 (2, 5)를 변경하여 자신의 오프셋과 제한을 적용 할 수 있습니다 (첫 번째 인수는 오프셋이고 limi t는 첫 번째 인수와 두 번째 인수의 차이입니다.) 경기 단계 here

db.getCollection('other').aggregate([ 
    /// match a specific document 
    {$match: {"_id": ObjectId("5979e0473f00003717a9bd62")}}, 
    // project on assignments and apply a slice to the projection 
    {$project: {assignments: {$slice: ['$assignments', 2, 5]}}} 
]) 

자세한 내용 : 위의에 (특정 문서를 해결하기 위해) 일치하는 조건을 추가하려면

는이 같은 일을 할 것입니다.

+0

답변 해 주셔서 감사합니다. 그러나 같은 쿼리에서 find를 사용하면이 쿼리가 콜렉션의 모든 문서를 제공한다는 것을 의미합니다.하지만 특정 문서를 원한다면 고유 한 ID를 사용하는 것이 좋습니다. – raja

+0

** 및 ** 프로젝트를 어떻게 찾을 수 있습니까? 그렇다면'$ match' 단계의 사용법을 보여주기 위해 답을 업데이트했습니다. – glytching

+0

감사합니다. – raja