2016-10-27 1 views
3

Ich habe die folgende Abfrage.

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}) 

Dies sollte 1847 Dokumente zurückgeben. Jedoch, wenn ich es ausführe, bekomme ich nur 1000 Dokumente, das ist die batchSize des Cursors und dann schließt der Cursor (seinen cursorId auf 0 setzend), als ob alle Dokumente zurückgegeben wurden.

Wenn ich die Sortierung herausnehme, dann bekomme ich alle 1847 Dokumente.

Also meine Frage ist, warum es im Stillen scheitert, wenn Sie mit der Operator sortieren?

EDIT

explain Verwendung gibt die folgende Ausgabe

{ 
    "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‘ Ich habe auch den 'uid. $ id_1_levelno_1__id_1'-Index hinzugefügt, aber es macht keinen Unterschied zur zurückgegebenen Anzahl an Dokumenten. – XeniaSis

+0

Ich habe die Ausgabe zu der Frage – XeniaSis

+0

hinzugefügt, die auch mit https: //jira.mongodb zusammenhängt.org/browse/SERVER-7267 aber sie sagen, dass es behoben wurde – XeniaSis

Antwort

0

Was passiert, ist, dass diese sortierten Abfrage im Speicher ausgeführt werden müssen, da sie nicht durch einen Index unterstützt wird, und dies begrenzt die Ergebnisse bis 32 MB. Dieses Verhalten ist dokumentiert here, mit einem JIRA zum Adressieren dieser here.

Außerdem Sie nicht einen Index definieren diese Abfrage zu unterstützen, wie Sie auf einem Feld zu sortier, die nicht Teil der Abfrage ist, und keiner dieser Fälle gelten:

Wenn Die Sortierschlüssel entsprechen den Indexschlüsseln oder einem Indexpräfix, MongoDB kann den Index zum Sortieren der Abfrageergebnisse verwenden. Ein Präfix eines zusammengesetzten Index ist eine Teilmenge, die aus einem oder mehreren Schlüsseln am Start des Indexschlüsselmusters besteht.

...

Ein Index kann Sortiervorgänge auf einem nicht Präfixteilmenge des Indexschlüsselmuster unterstützen. Zu diesem Zweck muss die Abfrage Gleichheit Bedingungen für alle Präfixschlüssel enthalten, die den Sortierschlüsseln vorausgehen.

Sie sollten mit Hilfe der Aggregation Rahmen um die Einschränkung umgehen können, die über die allowDiskUse: true Option ist erforderlich, wenn temporäre Dateien für die Ausgänge seiner Pipeline-Stufe zu verwenden, kann angewiesen werden:

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

Sie objsLeftInBatch() Methode verwenden können, um zu bestimmen, wie viele Objekt im Batch-links und über sie iterieren.

Sie können die Größe und Grenze der Cursor Losgröße cursor.batchSize(size) und cursor.limit(limit) mit außer Kraft setzen

+0

Ich bin nicht wirklich auf der Suche nach einer Lösung, ich möchte nur verstehen, warum dies nicht funktioniert, wie es erwartet wurde – XeniaSis

+0

Der MongoDB-Server gibt die Abfrageergebnisse in Batches zurück. Die Stapelgröße überschreitet nicht die maximale BSON-Dokumentgröße. Für die meisten Abfragen reicht der erste Batch aus, um Dokumente zu überschreiten, die größer als 1 Megabyte sind. Nachfolgende Stapelgröße beträgt 4 Megabyte. Um die Standardgröße des Stapels zu überschreiben, verwenden Sie Methoden wie Batchgröße und Limit –

Verwandte Themen