2016-10-27 16 views
3

次のクエリがあります。

db.getCollection('logs').find({'uid.$id': { 
    '$in': [ 
     ObjectId("580e3397812de36b86d68c04"), 
     ObjectId("580e33a9812de36b86d68c0b"), 
     ObjectId("580e339a812de36b86d68c09"), 
     ObjectId("580e339a812de36b86d68c08"), 
     ObjectId("580e33a9812de36b86d68c0a"), 
     ObjectId("580e33bd812de36b86d68c11"), 
     ObjectId("580e33c0812de36b86d68c13") 
    ]}, levelno: { '$gte': 10 } 
}).sort({_id: 1}) 

これは1847文書を返します。しかし、それを実行すると、私はカーソルのbatchSizeである1000のドキュメントだけを取得し、すべてのドキュメントが返されたかのようにカーソルを閉じます(cursorIdを0に設定します)。

ソートを取り除くと、1847件の文書がすべて取得されます。

私の質問は、$in演算子で並べ替えを使用すると、なぜ静かに失敗しますか? explainを使用して

EDIT

あなたはバッチに残っているどのように多くのオブジェクトを決定し、それを反復するobjsLeftInBatch()メソッドを使用することができ、次の出力に

{ 
    "queryPlanner" : { 
     "plannerVersion" : 1, 
     "namespace" : "session.logs", 
     "indexFilterSet" : false, 
     "parsedQuery" : { 
      "$and" : [ 
       { 
        "levelno" : { 
         "$gte" : 10 
        } 
       }, 
       { 
        "uid.$id" : { 
         "$in" : [ 
          ObjectId("580e3397812de36b86d68c04"), 
          ObjectId("580e339a812de36b86d68c08"), 
          ObjectId("580e339a812de36b86d68c09"), 
          ObjectId("580e33a9812de36b86d68c0a"), 
          ObjectId("580e33a9812de36b86d68c0b"), 
          ObjectId("580e33bd812de36b86d68c11"), 
          ObjectId("580e33c0812de36b86d68c13") 
         ] 
        } 
       } 
      ] 
     }, 
     "winningPlan" : { 
      "stage" : "SORT", 
      "sortPattern" : { 
       "_id" : 1 
      }, 
      "inputStage" : { 
       "stage" : "SORT_KEY_GENERATOR", 
       "inputStage" : { 
        "stage" : "FETCH", 
        "inputStage" : { 
         "stage" : "IXSCAN", 
         "keyPattern" : { 
          "uid.$id" : 1, 
          "levelno" : 1, 
          "_id" : 1 
         }, 
         "indexName" : "uid.$id_1_levelno_1__id_1", 
         "isMultiKey" : false, 
         "isUnique" : false, 
         "isSparse" : false, 
         "isPartial" : false, 
         "indexVersion" : 1, 
         "direction" : "forward", 
         "indexBounds" : { 
          "uid.$id" : [ 
           "[ObjectId('580e3397812de36b86d68c04'), ObjectId('580e3397812de36b86d68c04')]", 
           "[ObjectId('580e339a812de36b86d68c08'), ObjectId('580e339a812de36b86d68c08')]", 
           "[ObjectId('580e339a812de36b86d68c09'), ObjectId('580e339a812de36b86d68c09')]", 
           "[ObjectId('580e33a9812de36b86d68c0a'), ObjectId('580e33a9812de36b86d68c0a')]", 
           "[ObjectId('580e33a9812de36b86d68c0b'), ObjectId('580e33a9812de36b86d68c0b')]", 
           "[ObjectId('580e33bd812de36b86d68c11'), ObjectId('580e33bd812de36b86d68c11')]", 
           "[ObjectId('580e33c0812de36b86d68c13'), ObjectId('580e33c0812de36b86d68c13')]" 
          ], 
          "levelno" : [ 
           "[10.0, inf.0]" 
          ], 
          "_id" : [ 
           "[MinKey, MaxKey]" 
          ] 
         } 
        } 
       } 
      } 
     }, 
     "rejectedPlans" : [ 
      { 
       "stage" : "SORT", 
       "sortPattern" : { 
        "_id" : 1 
       }, 
       "inputStage" : { 
        "stage" : "SORT_KEY_GENERATOR", 
        "inputStage" : { 
         "stage" : "FETCH", 
         "inputStage" : { 
          "stage" : "IXSCAN", 
          "keyPattern" : { 
           "levelno" : 1, 
           "_id" : 1, 
           "uid.$id" : 1 
          }, 
          "indexName" : "levelno_1__id_1_uid.$id_1", 
          "isMultiKey" : false, 
          "isUnique" : false, 
          "isSparse" : false, 
          "isPartial" : false, 
          "indexVersion" : 1, 
          "direction" : "forward", 
          "indexBounds" : { 
           "levelno" : [ 
            "[10.0, inf.0]" 
           ], 
           "_id" : [ 
            "[MinKey, MaxKey]" 
           ], 
           "uid.$id" : [ 
            "[ObjectId('580e3397812de36b86d68c04'), ObjectId('580e3397812de36b86d68c04')]", 
            "[ObjectId('580e339a812de36b86d68c08'), ObjectId('580e339a812de36b86d68c08')]", 
            "[ObjectId('580e339a812de36b86d68c09'), ObjectId('580e339a812de36b86d68c09')]", 
            "[ObjectId('580e33a9812de36b86d68c0a'), ObjectId('580e33a9812de36b86d68c0a')]", 
            "[ObjectId('580e33a9812de36b86d68c0b'), ObjectId('580e33a9812de36b86d68c0b')]", 
            "[ObjectId('580e33bd812de36b86d68c11'), ObjectId('580e33bd812de36b86d68c11')]", 
            "[ObjectId('580e33c0812de36b86d68c13'), ObjectId('580e33c0812de36b86d68c13')]" 
           ] 
          } 
         } 
        } 
       } 
      }, 
      { 
       "stage" : "FETCH", 
       "filter" : { 
        "$and" : [ 
         { 
          "levelno" : { 
           "$gte" : 10 
          } 
         }, 
         { 
          "uid.$id" : { 
           "$in" : [ 
            ObjectId("580e3397812de36b86d68c04"), 
            ObjectId("580e339a812de36b86d68c08"), 
            ObjectId("580e339a812de36b86d68c09"), 
            ObjectId("580e33a9812de36b86d68c0a"), 
            ObjectId("580e33a9812de36b86d68c0b"), 
            ObjectId("580e33bd812de36b86d68c11"), 
            ObjectId("580e33c0812de36b86d68c13") 
           ] 
          } 
         } 
        ] 
       }, 
       "inputStage" : { 
        "stage" : "IXSCAN", 
        "keyPattern" : { 
         "_id" : 1 
        }, 
        "indexName" : "_id_", 
        "isMultiKey" : false, 
        "isUnique" : true, 
        "isSparse" : false, 
        "isPartial" : false, 
        "indexVersion" : 1, 
        "direction" : "forward", 
        "indexBounds" : { 
         "_id" : [ 
          "[MinKey, MaxKey]" 
         ] 
        } 
       } 
      } 
     ] 
    }, 
    "ok" : 1 
} 
+0

@JohnnyHK 'uid。$ id_1_levelno_1__id_1'インデックスも追加しましたが、返されたドキュメントの数には違いがありません – XeniaSis

+0

質問に出力を追加しました – XeniaSis

+0

もhttps://jira.mongodbに関連しているようです。org/browse/SERVER-7267しかし、彼らはそれが修正されたと言います – XeniaSis

答えて

0

を上書きすることができますが、それがインデックスでサポートされていないとして、このソートクエリはメモリ内に行われなければならないことであり、これは結果を制限します32 MBまで。この動作はhereと文書化されており、このアドレスはhereです。

さらに、あなたは、クエリの一部ではないフィールドにソートしているとして、このクエリをサポートするために、インデックスを定義しないことができ、これらの例のいずれもが適用されます。

の場合ソートキーはインデックスキーまたはインデックスプレフィックスに対応します。 MongoDBはインデックスを使用してクエリ結果をソートできます。 接頭辞の 複合インデックスは、インデックスキーパターンの 開始位置にある1つ以上のキーで構成されるサブセットです。

...

指数は インデックスキーパターンの非プレフィックスのサブセットにソート操作をサポートすることができます。これを行うには、クエリには、ソートキーの前にあるすべてのプレフィックスキーに等価 の条件を含める必要があります。

あなたはallowDiskUse: trueオプションを使用して、必要に応じてそのパイプラインステージの出力のための一時ファイルを使用するように指示することができます集約フレームワークを使用して制限を回避することができるはずです:i「は

db.getCollection('logs').aggregate([ 
    {$match: {'uid.$id': { 
     '$in': [ 
      ObjectId("580e3397812de36b86d68c04"), 
      ObjectId("580e33a9812de36b86d68c0b"), 
      ObjectId("580e339a812de36b86d68c09"), 
      ObjectId("580e339a812de36b86d68c08"), 
      ObjectId("580e33a9812de36b86d68c0a"), 
      ObjectId("580e33bd812de36b86d68c11"), 
      ObjectId("580e33c0812de36b86d68c13") 
     ]}, levelno: { '$gte': 10 } 
    }}, 
    {$sort: {_id: 1}} 
], { allowDiskUse: true }) 
0

を与えます。

あなたは何が起こっているサイズと制限カーソルのバッチサイズのcursor.batchSize(size)を使用してcursor.limit(limit)

+0

私は実際には解決策を探していませんが、なぜこれが期待通りに機能していないのか理解したいだけです – XeniaSis

+0

MongoDBサーバーはクエリ結果をバッチで返します。バッチサイズは最大BSONドキュメントサイズを超えません。 ほとんどのクエリでは、最初のバッチは1メガバイトを超える十分なドキュメントです。 後続のバッチサイズは4メガバイトです。バッチのデフォルトサイズをオーバーライドするには、batchsizeやlimitなどのメソッドを使用します。 –

関連する問題