2017-09-07 43 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