2017-09-07 4 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" 
     } 
    ] 
} 

私が必要と出力iは、次のクエリを使用し、この応答のための

{ 
    "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]で試したコメントリストの制限とオフセットを適用することですが、スライスされた結果は であるが、割り当てだけではないので、どのようにしてこれらの2つを組み合わせて、限界とオフセットの割り当てを得ることができるのだろうか。

答えて

1

aggregateは+ sliceを投影できるので、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は第1引数と第2引数の差です)。マッチステップ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

関連する問題