View a markdown version of this page

$sort - Amazon DocumentDB

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

$sort

T $sort ahap agregasi memesan dokumen dalam pipeline berdasarkan nilai bidang yang ditentukan. Dokumen diatur dalam urutan naik atau turun sesuai dengan kriteria pengurutan yang disediakan.

Parameter

  • field: Nama bidang yang akan diurutkan.

  • order: Gunakan 1 untuk urutan menaik atau -1 untuk urutan menurun.

Contoh (MongoDB Shell)

Contoh berikut menunjukkan penggunaan $sort tahap untuk memesan produk berdasarkan harga dalam urutan menurun.

Buat dokumen sampel

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

Contoh kueri

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

Keluaran

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

Contoh kode

Untuk melihat contoh kode untuk menggunakan tahap $sort agregasi, pilih tab untuk bahasa yang ingin Anda gunakan:

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

Penyortiran tambahan

Pengurutan inkremental adalah pengoptimalan di mana Amazon DocumentDB menggunakan indeks yang sudah mengurutkan bidang utama dari pengurutan multi-bidang. Amazon DocumentDB kemudian mengurutkan hanya bidang yang tersisa dalam setiap grup dokumen yang memiliki nilai utama yang sama. Alih-alih mengurutkan seluruh hasil yang ditetapkan dalam memori sebagai satu blok (tipe lengkap), Amazon DocumentDB membaca dokumen dalam urutan indeks. Kemudian melakukan banyak jenis kecil dan independen, satu per kelompok. Hasilnya identik dengan jenis lengkap. Hanya rencana kueri dan jumlah memori dan pekerjaan yang digunakannya berubah.

Keuntungan

Penyortiran inkremental memberikan manfaat berikut:

  • Penggunaan memori yang lebih rendah dan lebih sedikit tumpahan pengurutan berbasis disk. Amazon DocumentDB memesan satu grup kecil pada satu waktu alih-alih seluruh hasil yang ditetapkan sekaligus.

  • Hasil yang lebih cepat denganlimit. Amazon DocumentDB dapat memancarkan dokumen yang diurutkan sebelum membaca seluruh input. Urutan diikuti oleh limit (misalnya, top-n atau kueri berpaginasi) dapat berhenti segera setelah menghasilkan cukup dokumen.

Saat Amazon DocumentDB memilih pengurutan inkremental

Misalnya, jika diberi pengurutan { customerId: 1, orderDate: -1 } dan indeks hanya aktif{ customerId: 1 }, indeks sudah mengembalikan dokumen yang diurutkan berdasarkancustomerId. Amazon DocumentDB hanya perlu memesan setiap kelompok dokumen yang berbagi customerId dengan orderDate yang sama. Bidang utama yang sudah diurutkan (customerId) adalah kunci yang telah diatur sebelumnya. Bergantung pada seberapa banyak jenis yang sudah disediakan indeks, Amazon DocumentDB memilih salah satu dari tiga perilaku:

  • Indeks mengurutkan setiap kunci pengurutan. Tidak ada jenis yang diperlukan. Amazon DocumentDB membaca dokumen secara langsung dalam urutan yang diminta.

  • Indeks mengurutkan awalan utama dari kunci pengurutan. Amazon DocumentDB menggunakan pengurutan inkremental, hanya mengurutkan kunci di dalam setiap grup yang diurutkan sebelumnya.

  • Tidak ada indeks yang memerintahkan kunci pengurutan utama apa pun. Amazon DocumentDB melakukan pengurutan penuh atas seluruh input.

Persyaratan dan batasan

Penyortiran inkremental memerlukan Amazon DocumentDB 8.0.2 atau yang lebih baru, menjalankan perencana versi 3.0 (perencana kueri default pada Amazon DocumentDB 8.0.2). Untuk informasi selengkapnya tentang versi perencana, lihatPerencana kueri v3.

Amazon DocumentDB tidak dapat menggunakan indeks parSIAL atau indeks multikey (array) untuk menyediakan awalan yang telah diurutkan sebelumnya untuk pengurutan inkremental. Dalam kasus tersebut, Amazon DocumentDB kembali ke jenis lengkap. Ini tidak pernah mempengaruhi kebenaran hasil.

Memverifikasi pengurutan inkremental dengan explain()

Gunakan explain() untuk mengonfirmasi bahwa kueri menggunakan pengurutan inkremental. Dalam rencana pemenang, pengurutan inkremental muncul sebagai SORT tahap yang mencakup presortedKeys array yang mencantumkan bidang pengurutan utama yang sudah diurutkan indeks. Penyortiran penuh muncul sebagai SORT panggung tanpa presortedKeys array. Bid presortedKeys ang ini merupakan DocumentDB-specific tambahan Amazon untuk explain() output dan tidak muncul di MongoDB menjelaskan rencana.

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