View a markdown version of this page

$sort - Amazon DocumentDB

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

$sort

L'étape $sort d'agrégation classe les documents du pipeline en fonction des valeurs de champ spécifiées. Les documents sont classés par ordre croissant ou décroissant selon les critères de tri fournis.

Paramètres

  • field: nom du champ selon lequel le tri doit être effectué.

  • order: 1 à utiliser pour l'ordre croissant ou -1 décroissant.

Exemple (MongoDB Shell)

L'exemple suivant montre comment utiliser la $sort scène pour classer les produits par prix dans l'ordre décroissant.

Créez des exemples de documents

db.products.insertMany([ { _id: 1, name: "Laptop", category: "Electronics", price: 1200 }, { _id: 2, name: "Mouse", category: "Electronics", price: 25 }, { _id: 3, name: "Desk", category: "Furniture", price: 350 }, { _id: 4, name: "Chair", category: "Furniture", price: 150 }, { _id: 5, name: "Monitor", category: "Electronics", price: 400 } ]);

Exemple de requête

db.products.aggregate([ { $sort: { price: -1 } } ]);

Sortie

[ { _id: 1, name: 'Laptop', category: 'Electronics', price: 1200 }, { _id: 5, name: 'Monitor', category: 'Electronics', price: 400 }, { _id: 3, name: 'Desk', category: 'Furniture', price: 350 }, { _id: 4, name: 'Chair', category: 'Furniture', price: 150 }, { _id: 2, name: 'Mouse', category: 'Electronics', price: 25 } ]

Exemples de code

Pour afficher un exemple de code permettant d'utiliser l'étape d'$sortagrégation, choisissez l'onglet correspondant à la langue que vous souhaitez utiliser :

Node.js
const { MongoClient } = require('mongodb'); async function example() { const client = await MongoClient.connect('mongodb://<username>:<password>@<cluster-endpoint>:27017/?tls=true&tlsCAFile=global-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false'); const db = client.db('test'); const collection = db.collection('products'); const result = await collection.aggregate([ { $sort: { price: -1 } } ]).toArray(); console.log(result); await client.close(); } example();
Python
from pymongo import MongoClient def example(): client = MongoClient('mongodb://<username>:<password>@<cluster-endpoint>:27017/?tls=true&tlsCAFile=global-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false') db = client['test'] collection = db['products'] result = list(collection.aggregate([ { '$sort': { 'price': -1 } } ])) print(result) client.close() example()

Tri incrémentiel

Le tri incrémentiel est une optimisation dans laquelle Amazon DocumentDB utilise un index qui classe déjà les principaux champs d'un tri multichamps. Amazon DocumentDB trie ensuite uniquement les champs restants de chaque groupe de documents qui partagent les mêmes valeurs principales. Au lieu de trier l'ensemble des résultats en mémoire sous la forme d'un seul bloc (tri complet), Amazon DocumentDB lit les documents dans l'ordre d'index. Il effectue ensuite de nombreux petits tris indépendants, un par groupe. Les résultats sont identiques à ceux d'un tri complet. Seuls le plan de requête ainsi que la quantité de mémoire et de travail qu'il utilise changent.

Avantages

Le tri incrémentiel présente les avantages suivants :

  • Réduction de l'utilisation de la mémoire et des pertes de tri sur disque. Amazon DocumentDB commande un petit groupe à la fois plutôt que l'ensemble des résultats en une seule fois.

  • Des résultats plus rapides aveclimit. Amazon DocumentDB peut émettre des documents triés avant de lire l'intégralité de l'entrée. Un tri suivi d'un limit (par exemple, une requête top-N ou paginée) peut s'arrêter dès qu'il a produit suffisamment de documents.

Quand Amazon DocumentDB choisit un tri incrémentiel

Par exemple, si le tri est activé { customerId: 1, orderDate: -1 } et que l'index est activé uniquement{ customerId: 1 }, l'index renvoie déjà les documents triés par ordrecustomerId. Amazon DocumentDB n'a besoin que de classer chaque groupe de documents qui partagent le même contenu customerId parorderDate. Le champ de début déjà ordonné (customerId) est la clé prétriée. En fonction du niveau de tri déjà fourni par un index, Amazon DocumentDB choisit l'un des trois comportements suivants :

  • L'index classe chaque clé de tri. Aucun tri n'est nécessaire. Amazon DocumentDB lit les documents directement dans l'ordre demandé.

  • L'index classe un préfixe principal des clés de tri. Amazon DocumentDB utilise un tri incrémentiel, classant uniquement les clés de fin de chaque groupe prétrié.

  • Aucun index n'ordonne aucune clé de tri principale. Amazon DocumentDB effectue un tri complet sur l'ensemble de l'entrée.

Exigences et limites

Le tri incrémentiel nécessite Amazon DocumentDB 8.0.2 ou version ultérieure, exécutant le planificateur version 3.0 (le planificateur de requêtes par défaut depuis Amazon DocumentDB 8.0.2). Pour plus d'informations sur les versions du planificateur, consultezPlanificateur de requêtes v3.

Amazon DocumentDB ne peut pas utiliser d'index partiel ou d'index multiclé (tableau) pour fournir le préfixe prétrié pour un tri incrémentiel. Dans ces cas, Amazon DocumentDB revient à un tri complet. Cela n'affecte jamais l'exactitude des résultats.

Vérification d'un tri incrémentiel avec explain()

explain()À utiliser pour confirmer qu'une requête utilise un tri incrémentiel. Dans le plan gagnant, un tri incrémentiel apparaît sous la forme d'une SORT étape qui comprend un presortedKeys tableau répertoriant les principaux champs de tri que l'index a déjà triés. Un tri complet apparaît sous la forme d'une SORT étape sans presortedKeys tableau. Le presortedKeys champ est un DocumentDB-specific ajout d'Amazon à la explain() sortie et n'apparaît pas dans les plans d'explication de MongoDB.

db.orders.createIndex({ customerId: 1 }) db.orders.find({}).sort({ customerId: 1, orderDate: -1 }).explain()
{ "stage": "SORT", "sortPattern": { "customerId": 1, "orderDate": -1 }, "presortedKeys": [ "customerId" ], "inputStage": { "stage": "IXSCAN", "indexName": "customerId_1", "direction": "forward" } }