2017-09-07 47 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的切片。您可以更改切片參數(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

感謝您的回答。但是如何在相同的查詢中使用查找意味着此查詢爲我提供了集合中的所有文檔,但是如果我想通過某個唯一的id來查找特定的文檔。 – raja

+0

你問你如何找到**和**項目?如果是這樣,我已經更新了答案,以顯示使用'$ match'階段。 – glytching

+0

非常感謝你的工作。 – raja