Abfrageplaner - Amazon DocumentDB

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Abfrageplaner

Der neue Abfrageplaner für Amazon DocumentDB (Planner Version 2.0) bietet erweiterte Funktionen zur Abfrageoptimierung und verbesserte Leistung. Planner Version 2.0 für Amazon DocumentDB 5.0 bietet eine bis zu 10-fache Leistungsverbesserung gegenüber der Vorgängerversion bei der Verwendung von find update Operatoren mit Indizes. Leistungsverbesserungen ergeben sich hauptsächlich aus der Verwendung optimalerer Indexpläne und der Aktivierung der Indexscanunterstützung für Operatoren wie Negationsoperatoren ($neq,$nin) und verschachtelte Operatoren. $elementMatch Abfragen in Planner Version 2.0 werden dank besserer Techniken zur Kostenschätzung, optimierter Algorithmen und verbesserter Stabilität schneller ausgeführt. Planner Version 2.0 unterstützt auch den Plan-Cache-Filter APIs , wodurch die Stabilität von Planner verbessert wird. Mit dieser Funktion bietet Amazon DocumentDB 5.0 jetzt die Möglichkeit, aus den verschiedenen Versionen des Abfrageplaners auszuwählen.

Voraussetzungen

Für Planner Version 2.0 gelten die folgenden Voraussetzungen:

  • Planner Version 2.0 ist in allen Regionen verfügbar, in denen Engine-Version 5.0 verfügbar ist.

  • Um sich für die Verwendung von Version 2.0 als Standard-Abfrageplaner zu entscheiden, muss Ihr Cluster auf der Engine-Patch-Version 3.0.15902 oder höher von Amazon DocumentDB Version 5.0 installiert sein. Anweisungen zur Aktualisierung auf den neuesten Engine-Versionspatch finden Sie unter. Durchführen eines Patch-Updates für die Engine-Version eines Clusters

  • Um Planner Version 2.0 als Standard-Abfrageplaner festzulegen, benötigen Sie IAM-Berechtigungen, um Cluster-Parametergruppen zu aktualisieren.

Wählen Sie Planner Version 2.0 als Standard-Abfrageplaner aus

Gehen Sie wie folgt vor, um 2.0 über die Konsole oder CLI als Standard-Abfrageplaner auszuwählen:

  • Folgen Sie den Schritten unterAmazon DocumentDB-Cluster-Parameter ändern, um die Parametergruppe Ihres Clusters zu ändern.

  • Ändern Sie für den Parameter mit dem Titel 'PlannerVersion' den Wert auf 2.0, was auf Planner-Version 2.0 hinweist.

  • Wählen Sie Sofort anwenden (wenn Sie Beim Neustart anwenden auswählen, wird die Auswahl bis zum nächsten Neustart des Clusters unwirksam).

Bewährte Methoden

Verwenden Sie die folgenden bewährten Methoden, um die erwarteten Ergebnisse zu erzielen, wenn Sie Planner Version 2.0 anwenden:

  • Wählen Sie in einem globalen Cluster denselben plannerVersion Wert (1,0 oder 2,0) in den Cluster-Parametergruppen für beide Regionen aus. Beachten Sie, dass die Auswahl verschiedener Planner-Versionen in primären und sekundären Regionen zu einem inkonsistenten Abfrageverhalten und einer inkonsistenten Leistung führen kann.

  • Die Aktualisierung auf Planner Version 2.0 während eines geplanten Wartungsfensters oder in Zeiten mit reduziertem Datenverkehr ist am wenigsten störend, da es zu erhöhten Fehlerraten kommen kann, wenn die Planner-Version geändert wird, während Workloads aktiv ausgeführt werden.

  • Planner Version 2.0 funktioniert am besten mit der MongoDB-Shell-Version 5.0.

Einschränkungen

Die folgenden Einschränkungen gelten für Planner Version 2.0:

  • Planner Version 2.0 wird in Elastic Clustern nicht unterstützt, da hier auf Planner Version 1.0 zurückgegriffen wird.

  • Planner-Version 2.0 wird für Aggregation und unterschiedliche Befehle nicht unterstützt. Stattdessen wird auf Planner Version 1.0 zurückgegriffen.

  • Abfragen, die Regex, Textsuche, Geodaten, Jsonschema oder Filter enthalten, werden mit dem Plan-Cache-Filter $expr in Planner Version 2.0 nicht unterstützt.

UpdateVerbesserungen an und Operatoren Find

Planner Version 2.0 optimiert grundlegende Operationen wiefind, updatedelete, und find-and-modify Befehle. In den folgenden Abschnitten mit Registern werden die erweiterten Funktionen für Indizes sowie die Verbesserungen der Abfrageleistung mit Planner Version 2.0 beschrieben:

Enhanced index support
  • Planner Version 2.0 bietet Indexunterstützung für Negationsoperatoren wie $nin$ne, $not {eq}$not {in}, und sowie und. $type $elemMatch

    Sample Document: { "x": 10, "y": [1, 2, 3] } db.foo.createIndex({ "x": 1, "y": 1 }) db.foo.find({ "x": {$nin: [20, 30] }}) db.foo.find({"x":{ $type: "string" }}) db.foo.createIndex({"x.y": 1}) db.foo.find({"x":{$elemMatch:{"y":{$elemMatch:{"$gt": 3 }}}}})
  • Planner Version 2.0 verwendet dünnbesetzte Indizes oder partielle Indizes, auch wenn sie im $exists Abfrageausdruck nicht vorhanden sind.

    Sample Document: {"name": "Bob", "email": "example@fake.com" } Using Planner Version 1.0, you can specify the command as shown below: db.foo.find({email: "example@fake.com", email: {$exists: true}}) Using Planner Version 2.0, you can specify command without $exists: db.foo.find({ email: "example@fake.com" })
  • Planner Version 2.0 verwendet Teilindizes auch dann, wenn die Abfragebedingung nicht genau mit dem Filterausdruck für den Teilindex übereinstimmt.

    Sample Document: {"name": "Bob", "age": 34} db.foo.createIndex({"age":1},{partialFilterExpression:{"age":{$lt:50}}}) With Planner Version 1.0, index is used only when the query condition meets the partial index filter criterion: db.foo.find({"age":{$lt:50}}) With Planner Version 2.0, index is used even when the query condition doesn’t meet the index criterion: db.foo.find({"age":{$lt:30}})
  • Planner Version 2.0 verwendet einen partiellen Indexscan mit $elemMatch-Abfragen.

    Sample Document: {"name": "Bob", "age": [34,35,36]} db.foo.createIndex({"age":1},{partialFilterExpression:{"age":{$lt:50,$gt:20}}}) db.foo.find({age:{$elemMatch:{$lt:50,$gt:20}}})
  • Planner Version 2.0 bietet Unterstützung für Indexscans$regex, ohne dass Sie $hint in Ihrem Anwendungscode angeben müssen. $regexunterstützt nur Indexsuchen nach Präfixen.

    Sample Document: { "x": [1, 2, 3], "y": "apple" } db.foo.createIndex({ "x": 1, "y": 1 }) db.foo.find({"y":{ $regex: "^a" }})
  • Planner Version 2.0 verbessert die Leistung von Abfragen mit Indizes mit mehreren Schlüsseln, wobei Gleichheitsbedingungen für Felder mit mehreren Schlüsseln gelten.

    Sample Document: {"x": [1, 2, 3], "y": 5} db.foo.createIndex({"x": 1, "y":1}) db.foo.find({"x": 2, "y": {$gt: 1}}).limit(1)
  • Planner Version 2.0 verbessert die Leistung von Abfragen, die mehrere Filter verwenden, insbesondere bei Sammlungen mit Dokumenten, die größer als 8 KB sind.

    Sample Document: {"x": 2, "y": 4, "z": 9, "t": 99} db.foo.find({$and: [{"x": {$gt : 1}, "y": {$gt : 3}, "z": {$lt : 10}, "t":{$lt : 100}}]})
  • Planner Version 2.0 verbessert die Leistung von Abfragen, wenn der $in Operator mit einem zusammengesetzten Index verwendet wird, da die Sortierphase entfällt.

    Sample Document: {"x": 2, "y": 4, "z": 9, "t": 99} db.foo.createIndex({"x":1, "y":1}) db.foo.find({"x":2, "y":$in:[1,2,3,4]}).sort({x:1,y:1})

    Es verbessert auch die Leistung von Abfragen, die Mehrschlüsselindizes mit $in Elementen verwenden.

    Sample Document: {"x": [1, 2, 3]} db.foo.createIndex({"x": 1}) db.foo.find("x":{$in:[>100 elements]})
Query performance improvements
  • Planner Version 2.0 verbessert die Leistung von Abfragen, die mehrere Filter verwenden, insbesondere bei Sammlungen mit Dokumenten, die größer als 8 KB sind.

    Sample Document: {"x": 2, "y": 4, "z": 9, "t": 99} db.foo.find({$and: [{"x": {$gt : 1}, "y": {$gt : 3}, "z": {$lt : 10}, "t":{$lt : 100}}]})
  • Planner Version 2.0 verbessert die Leistung von Abfragen, wenn der $in Operator mit einem zusammengesetzten Index verwendet wird, da die Sortierphase entfällt.

    Sample Document: {"x": 2, "y": 4, "z": 9, "t": 99} db.foo.createIndex({"x":1, "y":1}) db.foo.find({"x":2, "y":$in:[1,2,3,4]}).sort({x:1,y:1})

    Es verbessert auch die Leistung von Abfragen, die Mehrschlüsselindizes mit $in Elementen verwenden.

    Sample Document: {"x": [1, 2, 3]} db.foo.createIndex({"x": 1}) db.foo.find("x":{$in:[>100 elements]})

Planen Sie die Cache-Filter-API

Anmerkung

Der Textindex wird vom Plan-Cache-Filter nicht unterstützt.

  • Planner Version 2.0 bietet Unterstützung für die Indexfilterfunktion, mit der Sie eine Liste von Indizes angeben können, die ein bestimmtes Abfrage-Shape verwenden kann. Auf diese Funktion kann über die API zugegriffen werden und sie kann von der Serverseite aus gesteuert werden. Wenn Sie eine Abfrageregression feststellen, bietet Ihnen diese Funktion eine schnellere und flexiblere Möglichkeit, das Problem zu beheben, ohne Ihren Anwendungscode ändern zu müssen.

    db.runCommand({ planCacheSetFilter: <collection>, query: <query>, sort: <sort>, // optional, indexes: [ <index1>, <index2>, ...], comment: <any> // optional})

    Verwenden Sie den folgenden Befehl, um alle Filter in der Sammlung aufzulisten:

    db.runCommand( { planCacheListFilters: <collection> } )

    Dieser Befehl zeigt alle Indexfilter für die Sammlung an. Beispielausgabe:

    { "filters" : [ { "query" : {a: "@", b: "@"}, "sort" : {a: 1}, "indexes" : [ <index1>, ... ] }, ... ], "ok": 1 }
  • Sie können zwei neue Felder aus der explain Befehlsausgabe verwenden, um die Indexfilterung von Planner Version 2.0 zu analysieren: indexFilterSet undindexFilterApplied. indexFilterSetist auf „true“ gesetzt, wenn für die Sammlung ein Indexfilter festgelegt ist, der der Abfrageform entspricht. indexFilterAppliedist genau dann auf „true“ gesetzt, wenn die Abfrage einen Indexfilter angewendet und einen Plan ausgewählt hat, der einen Index in der Filterliste verwendet.

    Sie können den Indexfilter mit dem folgenden Befehl löschen:

    db.runCommand( { planCacheClearFilters: <collection>> query: <query pattern>, // optional sort: <sort specification>, // optional comment: <any>. //optional } )

    Verwenden Sie den folgenden Befehl, um alle Filter in der Sammlung „foo“ zu löschen:

    db.runCommand({planCacheClearFilters: "foo"})

    Um ein bestimmtes Abfrage-Shape mit beliebiger Sortierung zu löschen, können Sie das Abfrage-Shape aus der Ausgabe von planCacheListFilters kopieren und einfügen:

    db.runCommand({planCacheClearFilters: "foo", query: {a: @}})

    Um ein bestimmtes Abfrage-Shape mit einem bestimmten Feld zu löschen, nach dem sortiert werden soll, können Sie das Abfrage-Shape aus der Ausgabe von kopieren und einfügenplanCacheListFilters:

    db.runCommand({planCacheClearFilters: "foo", query: {a: @},sort: {a: 1}})

Mögliche Verhaltensunterschiede zwischen Planner Version 1.0, 2.0 und MongoDB

In einigen Randfällen ist es möglich, dass Planner Version 2.0 Ergebnisse liefert, die geringfügig von den Ergebnissen in MongoDB abweichen. In diesem Abschnitt werden einige Beispiele für diese Möglichkeiten beschrieben.

$(update) and $(projection)
  • In einigen Fällen verhalten sich $(update) $(projection) Operatoren in MongoDB möglicherweise anders als die Planer-Version 1.0 von Amazon DocumentDB. Im Folgenden finden Sie einige Beispiele:

    db.students_list.insertMany( [ { _id: 5, student_ids: [ 100, 200 ], grades: [ 95, 100 ], grad_year: [ 2024, 2023 ] } ] )
    db.students_list.updateOne({ student_ids: 100, grades: 100, grad_year: 2024 }, { $set: { “grad_year.$”: 2025 } }
    • Planner Version 1.0 — Feld Updates 2022

    • MongoDB — Feld Updates 2022

    • Planner Version 2.0 — Feld Aktualisierungen 2021

  • db.col.insert({x:[1,2,3]}) db.col.update({$and:[{x:1},{x:3}]},{$set:{"x.$":500}})
    • Planner Version 1.0 — Aktualisiert das erste übereinstimmende Element nach dem Zufallsprinzip

    • MongoDB — Aktualisiert nach dem Zufallsprinzip das erste übereinstimmende Element

    • Planner Version 2.0 — Führt keine Aktualisierungen durch

  • db.col.insert({x:[1,2,3]}) db.col.find()
    • Planner Version 1.0 — Wählt das passende Element nach dem Zufallsprinzip aus

    • MongoDB — Wählt nach dem Zufallsprinzip das passende Element aus

    • Planner Version 2.0 — Trifft keine Auswahl

  • db.col.insert({x:100}) db.col.update({x:100},{x:100})
    • Planner Version 1.0 — Änderungen an der Anzahl modifizierter Änderungen

    • MongoDB — Geänderte Zähländerungen

    • Planner Version 2.0 — Die Anzahl von nModified ändert sich nicht, wenn sie mit demselben Wert aktualisiert wird.

  • Wenn der $(update) Operator mit verwendet wird$setOnInsert, geben Planner Version 1.0 und MongoDB einen Fehler aus, Planner Version 2.0 jedoch nicht.

  • Das Umbenennen eines nicht existierenden Felds in $field löst in Planner Version 2.0 einen Fehler aus, wohingegen in Planner Version 1.0 und MongoDB keine Updates erzeugt werden.

Index behavior
  • Planner Version 2.0 gibt einen Fehler aus, wenn sie mit einem ungeeigneten Index angewendet $hint wird, Planner Version 1.0 und MongoDB dagegen nicht.

    // Insert db.col.insert({x:1}) db.col.insert({x:2}) db.col.insert({x:3}) // Create index on x with partialFilter Expression {x:{$gt:2}} db.col.createIndex({x:1},{partialFilterExpression:{x:{$gt:2}}}) // Mongodb allows hint on the following queries db.col.find({x:1}).hint("x_1") // result is no documents returned because {x:1} is not indexed by the partial index // Without $hint mongo should return {x:1}, thus the difference in result between COLSCAN and IXSCAN DocumentDB will error out when $hint is applied on such cases. db.col.find({x:1}).hint("x_1") Error: error: { "ok" : 0, "operationTime" : Timestamp(1746473021, 1), "code" : 2, "errmsg" : "Cannot use Hint for this Query. Index is multi key index , partial index or sparse index and query is not optimized to use this index." } rs0:PRIMARY> db.runCommand({"planCacheSetFilter": "col", "query": { location: {$nearSphere: {$geometry: {type: "Point", coordinates: [1, 1]}}}}, "indexes": ["name_1"]}) { "ok" : 0, "operationTime" : Timestamp(1750815778, 1), "code" : 303, "errmsg" : "Unsupported query shape for index filter $nearSphere" }
  • $nearkann $hint({“$natural”:1}) in Planner Version 2.0 nicht verwendet werden.

    // indexes present are index on x and geo index rs0:PRIMARY> db.usarestaurants.getIndexes() [ { "v" : 4, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.usarestaurants" }, { "v" : 4, "key" : { "location" : "2dsphere" }, "name" : "location_2dsphere", "ns" : "test.usarestaurants", "2dsphereIndexVersion" : 1 } ] // Planner Version 2.0 will throw an error when $hint is applied with index "x_1" rs0:PRIMARY> db.usarestaurants.find({ "location":{ "$nearSphere":{ "$geometry":{ "type":"Point", "coordinates":[ -122.3516, 47.6156 ] }, "$minDistance":1, "$maxDistance":2000 } } }, { "name":1 }).hint({"$natural": 1}) Error: error: { "ok" : 0, "operationTime" : Timestamp(1746475524, 1), "code" : 291, "errmsg" : "unable to find index for $geoNear query" } // Planner Version 1.0 and MongoDB will not throw an error db.usarestaurants.find({ "location":{ "$nearSphere":{ "$geometry":{ "type":"Point", "coordinates":[ -122.3516, 47.6156 ] }, "$minDistance":1, "$maxDistance":2000 } } }, { "name":1 }).hint({"$natural": 1}) { "_id" : ObjectId("681918e087dadfd99b7f0172"), "name" : "Noodle House" }
  • Während MongoDB vollständige Regex-Indexscans unterstützt, unterstützt Planner Version 2.0 den Regex-Indexscan nur für Präfixfelder.

    // index on x db.col.createIndex({x:1}) // index scan is used only for prefix regexes rs0:PRIMARY> db.col.find({x: /^x/}).explain() { "queryPlanner" : { "plannerVersion" : 2, "namespace" : "test.col", "winningPlan" : { "stage" : "IXSCAN", "indexName" : "x_1", "direction" : "forward", "indexCond" : { "$and" : [ { "x" : { "$regex" : /^x/ } } ] }, "filter" : { "x" : { "$regex" : /^x/ } } } }, "indexFilterSet" : false, "indexFilterApplied" : false, "ok" : 1, "operationTime" : Timestamp(1746474527, 1) } // COLSCAN is used for non-prefix regexes rs0:PRIMARY> db.col.find({x: /x$/}).explain() { "queryPlanner" : { "plannerVersion" : 2, "namespace" : "test.col", "winningPlan" : { "stage" : "COLLSCAN", "filter" : { "x" : { "$regex" : /x$/ } } } }, "indexFilterSet" : false, "indexFilterApplied" : false, "ok" : 1, "operationTime" : Timestamp(1746474575, 1)
  • Es gibt einige inhärente Unterschiede bei der Verwendung von Plan-Cache-Filtern mit Planner Version 2.0 im Vergleich zu MongoDB. Während die Planner-Version 2.0 die Angabe von „Projektion“ und „Kollation“ mit Plan-Cache-Filtern nicht unterstützt, tut MongoDB dies. Der MongoDB-Indexfilter befindet sich jedoch nur im Arbeitsspeicher und geht nach dem Neustart verloren. Planner Version 2.0 behält Indexfilter bei Neustarts und Patches bei.

Others
  • Das Format der DML-Prüfprotokolle bei Verwendung von Planner Version 2.0 unterscheidet sich geringfügig von dem Format der Planner-Version 1.0.

    command - db.col.find({x:1}) ************** Audit logs generated ****************** // v1 format for dml audit logs {"atype":"authCheck","ts":1746473479983,"timestamp_utc":"2025-05-05 19:31:19.983","remote_ip":"127.0.0.1:47022","users":[{"user":"serviceadmin","db":"test"}],"param":{"command":"find","ns":"test.col","args":{"batchSize":101,"filter":{"x":1},"find":"col","limit":18446744073709551615,"lsid":{"id":{"$binary":"P6RCGz9ZS4iWBSSHWXW15A==","$type":"4"},"uid":{"$binary":"6Jo8PisnEi3dte03+pJFjdCyn/5cGQL8V2KqaoWsnk8=","$type":"0"}},"maxScan":18446744073709551615,"singleBatch":false,"skip":0,"startTransaction":false},"result":0}} // v2 formal for dml audit logs {"atype":"authCheck","ts":1746473583711,"timestamp_utc":"2025-05-05 19:33:03.711","remote_ip":"127.0.0.1:37754","users":[{"user":"serviceadmin","db":"test"}],"param":{"command":"find","ns":"test.col","args":{"find":"col","filter":{"x":1},"lsid":{"id":{"$binary":"nJ88TGCSSd+BeD2+ZtrhQg==","$type":"4"}},"$db":"test"},"result":0}}
  • Die Indexbedingung als Teil des Explain-Plans:

    rs0:PRIMARY> db.col.createIndex({index1:1}) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1, "operationTime" : Timestamp(1761149251, 1) }

    Planner Version 2.0 erklärt die Planausgabe mit Anzeige der Indexbedingung und des Filters:

    rs0:PRIMARY> db.col.find({$and:[{price:{$eq:300}},{item:{$eq:"apples"}}]}).explain() { "queryPlanner" : { "plannerVersion" : 2, "namespace" : "test.col", "winningPlan" : { "stage" : "IXSCAN", "indexName" : "price_1", "direction" : "forward", "indexCond" : { "$and" : [ { "price" : { "$eq" : 300 } } ] }, "filter" : { "$and" : [ { "item" : { "$eq" : "apples" } } ] } } }, "indexFilterSet" : false, "indexFilterApplied" : false, "ok" : 1, "operationTime" : Timestamp(1761149497, 1) }

    Planner Version 1.0 erklärt die Planausgabe:

    rs0:PRIMARY> db.col.find({$and:[{price:{$eq:300}},{item:{$eq:"apples"}}]}).explain() { "queryPlanner" : { "plannerVersion" : 1, "namespace" : "test.col", "winningPlan" : { "stage" : "IXSCAN", "indexName" : "price_1", "direction" : "forward" } }, "ok" : 1, "operationTime" : Timestamp(1761149533, 1) }

Planner Version 2.0 schließt Verhaltenslücke mit MongoDB

Es gibt einige Bereiche, in denen Planner Version 2.0 die Verhaltenslücken von MongoDB schließt:

  • Planner Version 2.0 ermöglicht die numerische Indexsuche in abgeflachten Arrays für: $elemMatch

    doc: {"x" : [ [ { "y" : 1 } ] ] } // Planner Version 2 and mongo > db.bar.find({"x.0": {$elemMatch: {y: 1}}}) { "_id" : ObjectId("68192947945e5846634c455a"), "x" : [ [ { "y" : 1 } ] ] } > db.bar.find({"x": {$elemMatch: {"0.y": 1}}}) { "_id" : ObjectId("68192947945e5846634c455a"), "x" : [ [ { "y" : 1 } ] ] } //Whereas Planner Version 1 wouldn't return any results. > db.bar.find({"x.0": {$elemMatch: {y: 1}}}) > db.bar.find({"x": {$elemMatch: {"0.y": 1}}})
  • Während Planner Version 1.0 Zeichenketten in der Projektion ausschloss, stimmt das Verhalten von Planner Version 2.0 mit MongoDB überein und behandelt sie als Literalwerte.“

    // Planner V2/ MongoDB > db.col.find() { "_id" : ObjectId("681537738aa101903ed2fe05"), "x" : 1, "y" : 1 } > db.col.find({},{x:"string"}) { "_id" : ObjectId("681537738aa101903ed2fe05"), "x" : "string" } // Planner V1 treats strings as exclude in projection rs0:PRIMARY> db.col.find() { "_id" : ObjectId("68153744d42969f11d5cca72"), "x" : 1, "y" : 1 } rs0:PRIMARY> db.col.find({},{x:"string"}) { "_id" : ObjectId("68153744d42969f11d5cca72"), "y" : 1 }
  • Planner Version 2.0 erlaubt wie MongoDB keine Projektion auf dieselben Felder „x“ und „x.a“:

    // Planner version 2/MongoDB will error out > db.col.find() { "_id" : ObjectId("68153da2012265816bc9ba23"), "x" : [ { "a" : 1 }, 3 ] } db.col.find({},{"x.a":1,"x":1}) // error // Planner Version 1 does not error out db.col.find() { "_id" : ObjectId("68153da2012265816bc9ba23"), "x" : [ { "a" : 1 }, 3 ] } db.col.find({},{"x.a":1,"x":1}) { "_id" : ObjectId("68153d60143af947c720d099"), "x" : [ { "a" : 1 }, 3 ] }
  • Planner Version 2.0 ermöglicht wie MongoDB die Projektion auf Unterdokumente:

    // Planner Version2/MongoDB supports projections on subdocuments db.col.find() { "_id" : ObjectId("681542d8f35ace71f0a50004"), "x" : [ { "y" : 100 } ] } > db.col.find({},{"x":{"y":1}}) { "_id" : ObjectId("681542b7a22d548e4ac9ddea"), "x" : [ { "y" : 100 } ] } // Planner V1 throws error if projection is subdocument db.col.find() { "_id" : ObjectId("681542d8f35ace71f0a50004"), "x" : [ { "y" : 100 } ] } rs0:PRIMARY> db.col.find({},{"x":{"y":1}}) Error: error: { "ok" : 0, "operationTime" : Timestamp(1746223914, 1), "code" : 2, "errmsg" : "Unknown projection operator y" }
  • Mit Planner Version 2.0 unterstützt die Projektion wie MongoDB keine Felder nach dem $ Operator:

    // Mongo and Planner Version 2 will error out db.col.find() { "_id" : ObjectId("68155fa812f843439b593f3f"), "x" : [ { "a" : 100 } ] } db.col.find({"x.a":100},{"x.$.a":1}) - // error // v1 will not error out db.col.find() { "_id" : ObjectId("68155fa812f843439b593f3f"), "x" : [ { "a" : 100 } ] } db.col.find({"x.a":100},{"x.$.a":1}) { "_id" : ObjectId("68155dee13b051d58239cd0a"), "x" : [ { "a" : 100 } ] }
  • Planner Version 2.0 ermöglicht wie MongoDB die $hint Verwendung von:

    // v1 will error out on $hint if there are no filters db.col.find({}).hint("x_1") Error: error: { "ok" : 0, "operationTime" : Timestamp(1746466616, 1), "code" : 2, "errmsg" : "Cannot use Hint for this Query. Index is multi key index , partial index or sparse index and query is not optimized to use this index." } // Mongo and Planner Version 2 will allow $hint usage db.col.find({}).hint("x_1") { "_id" : ObjectId("6818f790d5ba9359d68169cf"), "x" : 1 }