View a markdown version of this page

$sort - Amazon DocumentDB

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

$sort

La fase di $sort aggregazione ordina i documenti nella pipeline in base a valori di campo specificati. I documenti sono disposti in ordine crescente o decrescente in base ai criteri di ordinamento forniti.

Parametri

  • field: il nome del campo in base al quale ordinare.

  • order: utilizzare 1 per l'ordine crescente o -1 per l'ordine decrescente.

Esempio (MongoDB Shell)

L'esempio seguente dimostra l'utilizzo della $sort fase per ordinare i prodotti in base al prezzo in ordine decrescente.

Crea documenti di esempio

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

Esempio di interrogazione

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

Output

[ { _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 } ]

Esempi di codice

Per visualizzare un esempio di codice per l'utilizzo della fase di $sort aggregazione, scegli la scheda relativa alla lingua che desideri utilizzare:

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

Ordinamento incrementale

L'ordinamento incrementale è un'ottimizzazione in cui Amazon DocumentDB utilizza un indice che ordina già i campi principali di un ordinamento multicampo. Amazon DocumentDB ordina quindi solo i campi rimanenti all'interno di ciascun gruppo di documenti che condividono gli stessi valori iniziali. Invece di ordinare l'intero set di risultati in memoria come un blocco (ordinamento completo), Amazon DocumentDB legge i documenti in ordine di indice. Quindi esegue molti piccoli ordinamenti indipendenti, uno per gruppo. I risultati sono identici a quelli di un ordinamento completo. Cambiano solo il piano di interrogazione, la quantità di memoria e il lavoro utilizzati.

Vantaggi

L'ordinamento incrementale offre i seguenti vantaggi:

  • Minore utilizzo della memoria e minori perdite di ordinamento basate su disco. Amazon DocumentDB ordina un piccolo gruppo alla volta anziché l'intero set di risultati contemporaneamente.

  • Risultati più rapidi conlimit. Amazon DocumentDB può emettere documenti ordinati prima di leggere l'intero input. Un ordinamento seguito da a limit (ad esempio, una query Top-N o impaginata) può essere interrotto non appena viene prodotto un numero sufficiente di documenti.

Quando Amazon DocumentDB sceglie un ordinamento incrementale

Ad esempio, se l'ordinamento è attivo { customerId: 1, orderDate: -1 } e l'indice è attivo{ customerId: 1 }, l'indice restituisce già i documenti ordinati per. customerId Amazon DocumentDB deve solo ordinare ogni gruppo di documenti che condividono lo stesso criteriocustomerId. orderDate Il campo principale (customerId) già ordinato è la chiave preordinata. A seconda del tipo di indice già fornito, Amazon DocumentDB sceglie uno dei tre comportamenti:

  • L'indice ordina ogni chiave di ordinamento. Non è necessario alcun ordinamento. Amazon DocumentDB legge i documenti direttamente nell'ordine richiesto.

  • L'indice ordina un prefisso iniziale delle chiavi di ordinamento. Amazon DocumentDB utilizza un ordinamento incrementale, ordinando solo le chiavi finali all'interno di ciascun gruppo preordinato.

  • Nessun indice ordina alcuna chiave di ordinamento iniziale. Amazon DocumentDB esegue un ordinamento completo sull'intero input.

Requisiti e limitazioni

L'ordinamento incrementale richiede Amazon DocumentDB 8.0.2 o versioni successive, con Planner versione 3.0 (il pianificatore di query predefinito di Amazon DocumentDB 8.0.2). Per ulteriori informazioni sulle versioni del planner, consulta. Pianificatore di query v3

Amazon DocumentDB non può utilizzare un indice parziale o un indice a più chiavi (array) per fornire il prefisso preordinato per un ordinamento incrementale. In questi casi, Amazon DocumentDB ricorre a un ordinamento completo. Ciò non influisce mai sulla correttezza dei risultati.

Verifica di un ordinamento incrementale con explain()

explain()Da utilizzare per confermare che una query utilizza un ordinamento incrementale. Nel piano vincente, un ordinamento incrementale appare come una SORT fase che include una presortedKeys matrice che elenca i campi di ordinamento principali già ordinati nell'indice. Un ordinamento completo appare come una SORT fase senza presortedKeys matrice. Il presortedKeys campo è un' DocumentDB-specific aggiunta di Amazon all'explain()output e non viene visualizzato nei piani di spiegazione di 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" } }