Cara menggunakan mongodb allowdiskuse aggregate

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

Show

Berikut ini adalah perbedaan fungsional antara Amazon DocumentDB (dengan kompatibilitas MongoDB) dan MongoDB.

Manfaat fungsional dari Amazon DocumentDB

Transaksi Implisit

Di Amazon DocumentDB, semua pernyataan CRUD (

db.runCommand({
  update: "miles",
  updates: [
    {
      q: { "credit_card": { $eq: true } },
      u: { $mul: { "flight_miles.$[]": NumberInt(2) } },
      multi: true
    }
  ]
})
         
2,
db.runCommand({
  update: "miles",
  updates: [
    {
      q: { "credit_card": { $eq: true } },
      u: { $mul: { "flight_miles.$[]": NumberInt(2) } },
      multi: true
    }
  ]
})
         
3,
db.runCommand({
  update: "miles",
  updates: [
    {
      q: { "credit_card": { $eq: true } },
      u: { $mul: { "flight_miles.$[]": NumberInt(2) } },
      multi: true
    }
  ]
})
         
4,
db.runCommand({
  update: "miles",
  updates: [
    {
      q: { "credit_card": { $eq: true } },
      u: { $mul: { "flight_miles.$[]": NumberInt(2) } },
      multi: true
    }
  ]
})
         
5) menjamin atomisitas dan konsistensi, bahkan untuk operasi yang memodifikasi beberapa dokumen. Dengan peluncuran Amazon DocumentDB 4.0, transaksi eksplisit yang menyediakan properti ACID untuk operasi multi-pernyataan dan multi-koleksi kini didukung. Untuk lebih lanjut tentang menggunakan transaksi di Amazon DocumentDB, silakan lihat tampilkan Transaksi.

Berikut ini adalah contoh operasi di Amazon DocumentDB yang memodifikasi beberapa dokumen yang memenuhi perilaku atomik dan konsisten.

db.miles.update(
    { "credit_card": { $eq: true } },
    { $mul: { "flight_miles.$[]": NumberInt(2) } },
    { multi: true }
)
         
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
db.runCommand({
  update: "miles",
  updates: [
    {
      q: { "credit_card": { $eq: true } },
      u: { $mul: { "flight_miles.$[]": NumberInt(2) } },
      multi: true
    }
  ]
})
         
db.products.deleteMany({
  "cost": { $gt: 30.00 }
})
         
db.runCommand({
  delete: "products",
  deletes: [{ q: { "cost": { $gt: 30.00 } }, limit: 0 }]
})
         

Operasi individu yang menyusun operasi massal seperti

db.runCommand({
  update: "miles",
  updates: [
    {
      q: { "credit_card": { $eq: true } },
      u: { $mul: { "flight_miles.$[]": NumberInt(2) } },
      multi: true
    }
  ]
})
         
6 dan
db.runCommand({
  update: "miles",
  updates: [
    {
      q: { "credit_card": { $eq: true } },
      u: { $mul: { "flight_miles.$[]": NumberInt(2) } },
      multi: true
    }
  ]
})
         
7 bersifat atomik tetapi keseluruhan operasi massal tidak bersifat atomik. Misalnya, keseluruhan operasi
db.runCommand({
  update: "miles",
  updates: [
    {
      q: { "credit_card": { $eq: true } },
      u: { $mul: { "flight_miles.$[]": NumberInt(2) } },
      multi: true
    }
  ]
})
         
8 bersifat atomik jika operasi penyisipan individual berhasil dijalankan tanpa kesalahan. Jika kesalahan ditemukan pada operasi
db.runCommand({
  update: "miles",
  updates: [
    {
      q: { "credit_card": { $eq: true } },
      u: { $mul: { "flight_miles.$[]": NumberInt(2) } },
      multi: true
    }
  ]
})
         
8, setiap pernyataan penyisipan individu dalam operasi
db.runCommand({
  update: "miles",
  updates: [
    {
      q: { "credit_card": { $eq: true } },
      u: { $mul: { "flight_miles.$[]": NumberInt(2) } },
      multi: true
    }
  ]
})
         
8 akan dijalankan sebagai operasi atom. Jika Anda memerlukan properti ACID untuk operasi
db.runCommand({
  update: "miles",
  updates: [
    {
      q: { "credit_card": { $eq: true } },
      u: { $mul: { "flight_miles.$[]": NumberInt(2) } },
      multi: true
    }
  ]
})
         
8,
db.runCommand({
  update: "miles",
  updates: [
    {
      q: { "credit_card": { $eq: true } },
      u: { $mul: { "flight_miles.$[]": NumberInt(2) } },
      multi: true
    }
  ]
})
         
6, and
db.runCommand({
  update: "miles",
  updates: [
    {
      q: { "credit_card": { $eq: true } },
      u: { $mul: { "flight_miles.$[]": NumberInt(2) } },
      multi: true
    }
  ]
})
         
7, Anda sebaiknya menggunakan transaksi.

Amazon DocumentDB terus meningkatkan kompatibilitas pada MongoDB dengan merujuk kembali pada kemampuan yang perlu kami bangun sesuai permintaan pelanggan. Bagian ini berisi perbedaan fungsional yang telah kami hilangkan dari Amazon DocumentDB untuk mempermudah migrasi dan pembangunan aplikasi bagi pelanggan kami.

Pengindeksan Array

Mulai 23 April 2020, Amazon DocumentDB kini mendukung kemampuan untuk mengindeks array yang lebih besar daripada 2.048 byte. Batas untuk setiap item individual dalam array masih tetap 2.048 byte, dan ini konsisten dengan MongoDB.

Jika Anda membuat indeks baru, tidak ada tindakan yang diperlukan untuk memanfaatkan fungsionalitas yang ditingkatkan. Jika Anda sudah memiliki indeks, Anda dapat memanfaatkan peningkatan fungsionalitas dengan menghapus indeks tersebut dan membuatnya lagi. Versi indeks saat ini dengan kemampuan yang ditingkatkan adalah

db.products.deleteMany({
  "cost": { $gt: 30.00 }
})
         
4.

Untuk klaster produksi, penghapusan indeks mungkin berdampak pada performa aplikasi Anda. Kami menyarankan Anda untuk terlebih dahulu menguji dan melanjutkan dengan hati-hati ketika membuat perubahan pada sistem produksi. Selain itu, waktu yang dibutuhkan untuk menciptakan indeks akan menjadi fungsi ukuran data secara keseluruhan pada pengumpulan.

Anda dapat mengajikan kueri untuk versi indeks Anda dengan menggunakan perintah berikut.

db.collection.getIndexes()

Output dari operasi ini terlihat seperti berikut ini. Dalam output ini, versi indeks adalah

db.products.deleteMany({
  "cost": { $gt: 30.00 }
})
         
4, yang merupakan versi indeks terbaru.

[
    {
        "v" : 3,
        "key" : {
        "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]

Indeks Multi-kunci

Mulai 23 April 2020, Amazon DocumentDB sekarang mendukung kemampuan untuk membuat indeks gabungan dengan beberapa kunci dalam array yang sama.

Jika Anda membuat indeks baru, tidak ada tindakan yang diperlukan untuk memanfaatkan fungsionalitas yang ditingkatkan. Jika Anda sudah memiliki indeks, Anda dapat memanfaatkan peningkatan fungsionalitas dengan menghapus indeks tersebut dan membuatnya lagi. Versi indeks saat ini dengan kemampuan yang ditingkatkan adalah

db.products.deleteMany({
  "cost": { $gt: 30.00 }
})
         
4.

Untuk klaster produksi, penghapusan indeks mungkin berdampak pada performa aplikasi Anda. Kami menyarankan Anda untuk terlebih dahulu menguji dan melanjutkan dengan hati-hati ketika membuat perubahan pada sistem produksi. Selain itu, waktu yang dibutuhkan untuk menciptakan indeks akan menjadi fungsi ukuran data secara keseluruhan pada pengumpulan.

Anda dapat mengajikan kueri untuk versi indeks Anda dengan menggunakan perintah berikut.

db.collection.getIndexes()

Output dari operasi ini terlihat seperti berikut ini. Dalam output ini, versi indeks adalah

db.products.deleteMany({
  "cost": { $gt: 30.00 }
})
         
4, yang merupakan versi indeks terbaru.

[
    {
        "v" : 3,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
         

Karakter Null dalam String

Mulai 22 Juni 2020, Amazon DocumentDB sekarang mendukung karakter null (

db.products.deleteMany({
  "cost": { $gt: 30.00 }
})
         
8 ) dalam string.

Kontrol Akses Berbasis Peran

Mulai 26 Maret 2020, Amazon DocumentDB mendukung kontrol akses berbasis peran (RBAC) untuk peran bawaan. Untuk mempelajari selengkapnya, lihat Kontrol Akses Berbasis Peran. Amazon DocumentDB belum mendukung peran khusus untuk RBAC.

db.products.deleteMany({ "cost": { $gt: 30.00 } }) 9 Pengindeksan

Mulai 22 Juni 2020, Amazon DocumentDB kini mendukung kemampuan operator

db.products.deleteMany({
  "cost": { $gt: 30.00 }
})
         
9 untuk menggunakan indeks.

Untuk menggunakan indeks dengan operator

db.products.deleteMany({
  "cost": { $gt: 30.00 }
})
         
9, Anda harus menggunakan perintah
db.runCommand({
  delete: "products",
  deletes: [{ q: { "cost": { $gt: 30.00 } }, limit: 0 }]
})
         
2. Saat menggunakan
db.runCommand({
  delete: "products",
  deletes: [{ q: { "cost": { $gt: 30.00 } }, limit: 0 }]
})
         
2, Anda harus menentukan nama bidang tempat Anda menerapkan
db.products.deleteMany({
  "cost": { $gt: 30.00 }
})
         
9. Misalnya, jika Anda memiliki indeks pada bidang
db.runCommand({
  delete: "products",
  deletes: [{ q: { "cost": { $gt: 30.00 } }, limit: 0 }]
})
         
5 dengan nama indeks sebagai
db.runCommand({
  delete: "products",
  deletes: [{ q: { "cost": { $gt: 30.00 } }, limit: 0 }]
})
         
6,
db.runCommand({
  delete: "products",
  deletes: [{ q: { "cost": { $gt: 30.00 } }, limit: 0 }]
})
         
7 akan menggunakan indeks
db.runCommand({
  delete: "products",
  deletes: [{ q: { "cost": { $gt: 30.00 } }, limit: 0 }]
})
         
6, tetapi
db.runCommand({
  delete: "products",
  deletes: [{ q: { "cost": { $gt: 30.00 } }, limit: 0 }]
})
         
9 tidak akan menggunakan indeks. Anda dapat memverifikasi apakah suatu indeks dipilih dengan menggunakan perintah
db.collection.getIndexes()
0 atau menggunakan profiler untuk mencatat kueri lambat. Sebagai contoh,
db.collection.getIndexes()
1.

Metode

db.runCommand({
  delete: "products",
  deletes: [{ q: { "cost": { $gt: 30.00 } }, limit: 0 }]
})
         
2 ini hanya dapat digunakan dengan satu indeks pada satu waktu.

Penggunaan indeks untuk kueri

db.products.deleteMany({
  "cost": { $gt: 30.00 }
})
         
9 dioptimalkan untuk kueri ekspresi reguler yang menggunakan prefiks dan tidak menentukan opsi ekspresi reguler
db.collection.getIndexes()
4,
db.collection.getIndexes()
5, atau
db.collection.getIndexes()
6.

Saat menggunakan indeks dengan

db.products.deleteMany({
  "cost": { $gt: 30.00 }
})
         
9, Anda disarankan untuk membuat indeks pada bidang yang sangat selektif yang memuat jumlah nilai duplikat kurang dari 1% dari jumlah total dokumen dalam koleksi. Sebagai contoh, jika pengumpulan Anda berisi 100.000 dokumen, buat indeks hanya pada bidang tempat nilai yang sama muncul 1000 kali atau kurang.

Proyeksi untuk Dokumen Bersarang

Pada operator

db.collection.getIndexes()
8, terdapat perbedaan fungsional antara Amazon DocumentDB dan MongoDB di versi 3.6 yang telah diselesaikan di Amazon DocumentDB 4.0 tetapi akan tetap tidak didukung di Amazon DocumentDB 3.6.

Amazon DocumentDB 3.6 hanya mempertimbangkan bidang pertama dalam dokumen bersarang saat menerapkan proyeksi, sedangkan MongoDB 3.6 akan mengurai subdokumen dan menerapkan proyeksi ke setiap sub dokumen juga.

Misalnya: jika proyeksinya adalah

db.collection.getIndexes()
9, maka perilaku tersebut berfungsi seperti yang diharapkan di Amazon DocumentDB dan MongoDB. Namun, jika proyeksinya adalah
[
    {
        "v" : 3,
        "key" : {
        "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
0 maka Amazon DocumentDB 3.6 hanya akan menerapkan proyeksi ke
[
    {
        "v" : 3,
        "key" : {
        "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
1 dan bukan
[
    {
        "v" : 3,
        "key" : {
        "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
2 atau
[
    {
        "v" : 3,
        "key" : {
        "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
3. Di Amazon DocumentDB 4.0, proyeksi
[
    {
        "v" : 3,
        "key" : {
        "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
0 akan diterapkan ke
[
    {
        "v" : 3,
        "key" : {
        "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
1,
[
    {
        "v" : 3,
        "key" : {
        "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
2, dan
[
    {
        "v" : 3,
        "key" : {
        "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
3.

Perbedaan fungsional pada MongoDB

Basis Data Admin dan Koleksi

Amazon DocumentDB tidak mendukung basis data admin atau lokal atau koleksi MongoDB

[
    {
        "v" : 3,
        "key" : {
        "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
8 atau
[
    {
        "v" : 3,
        "key" : {
        "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
9 secara berurutan.

Di Amazon DocumentDB,

db.collection.getIndexes()
0 menyetel ulang penghitung untuk setiap permintaan
db.collection.getIndexes()
1. Jadi, jika
db.collection.getIndexes()
2 3000MS ditentukan, kueri membutuhkan 2800MS, dan setiap permintaan
db.collection.getIndexes()
1 berikutnya membutuhkan 300MS, maka kursor tidak akan kehabisan waktu. Kursor hanya akan kehabisan waktu jika satu operasi, baik kueri atau permintaan individu
db.collection.getIndexes()
1, membutuhkan lebih dari
db.collection.getIndexes()
2 yang ditentukan. Selanjutnya, penyapu yang memeriksa waktu eksekusi kursor berjalan pada perincian menit.

jelaskan()

Amazon DocumentDB mengemulasi API MongoDB 4.0 pada mesin basis data yang dibuat khusus yang memanfaatkan sistem penyimpanan yang didistribusikan, toleran terhadap kesalahan, dan penyembuhkan diri sendiri. Akibatnya, rencana kueri dan keluaran dari

db.collection.getIndexes()
0 mungkin berbeda antara Amazon DocumentDB dan MongoDB. Pelanggan yang ingin kontrol atas rencana kueri mereka dapat menggunakan operator
db.collection.getIndexes()
7 untuk memaksa pemilihan indeks yang diutamakan.

Pembatasan Nama Bidang

Amazon DocumentDB tidak mendukung titik-titik “.” dalam nama bidang dokumen, misalnya,

db.collection.getIndexes()
8.

Amazon DocumentDB juga tidak mendukung prefiks $ dalam nama bidang.

Misalnya, coba perintah berikut di Amazon DocumentDB atau MongoDB:

rs0:PRIMARY< db.foo.insert({"a":{"$a":1}})

MongoDB akan menampilkan hal berikut:

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
0

Amazon DocumentDB akan menampilkan kesalahan:

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
1

Ada pengecualian untuk perbedaan fungsional ini. Nama bidang berikut yang dimulai dengan prefiks $ telah masuk daftar putih dan dapat berhasil digunakan di Amazon DocumentDB: $id, $ref, dan $db.

Pembuatan indeks

Amazon DocumentDB hanya mengizinkan satu pembuatan indeks terjadi pada koleksi pada waktu tertentu. Baik di latar depan atau latar belakang. Jika operasi seperti

db.collection.getIndexes()
9 atau
[
    {
        "v" : 3,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
         
0 terjadi pada koleksi yang sama saat pembuatan indeks sedang berlangsung, operasi yang baru dicoba akan gagal.

Secara default, build indeks di Amazon DocumentDB dan MongoDB versi 4.0 terjadi di latar belakang. MongoDB versi 4.2, dan kemudian mengabaikan opsi build indeks latar belakang jika ditentukan untuk createIndexes atau pembantu shell-nya

db.collection.getIndexes()
9dan
[
    {
        "v" : 3,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
         
2.

Indeks Time to Live (TTL) memulai dokumen kedaluwarsa setelah pembuatan indeks selesai.

Pencarian dengan kunci kosong di jalur

Saat Anda melakukan pencarian dengan kunci yang menyertakan string kosong sebagai bagian dari jalur (mis.

[
    {
        "v" : 3,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
         
3,
[
    {
        "v" : 3,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
         
4), dan objek memiliki jalur kunci string kosong (mis.
[
    {
        "v" : 3,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
         
5) di dalam array, Amazon DocumentDB akan mengembalikan hasil yang berbeda dibandingkan jika Anda menjalankan pencarian yang sama di MongoDB.

Di MongoDB, pencarian jalur kunci kosong di dalam array berfungsi seperti yang diharapkan ketika kunci string kosong tidak berada di ujung pencarian jalur. Namun, ketika berada di ujung pencarian jalur, kunci string kosong tidak melihat ke dalam array.

Namun di Amazon DocumentDB, hanya elemen pertama dalam array yang dibaca, karena

[
    {
        "v" : 3,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
         
6 mengonversi string kosong menjadi
[
    {
        "v" : 3,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
         
7, sehingga pencarian kunci string diperlakukan sebagai pencarian indeks array.

API, Operasi, dan Tipe Data MongoDB

Amazon DocumentDB kompatibel dengan API MongoDB 3.6 dan 4.0. Untuk up-to-date daftar fungsionalitas yang didukung, lihatAPI, Operasi, dan Tipe Data MongoDB Yang Didukung.

Utilitas [ { "v" : 3, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.test" } ] 8 dan [ { "v" : 3, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.test" } ] 9

Amazon DocumentDB tidak mendukung basis data admin dan dengan demikian tidak membuang atau memulihkan bssis data admin saat menggunakan

[
    {
        "v" : 3,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
         
8 atau utilitas
[
    {
        "v" : 3,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
         
9. Saat Anda membuat basis data baru di Amazon DocumentDB dengan menggunakan
[
    {
        "v" : 3,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
         
9, Anda perlu membuat ulang peran pengguna selain operasi pemulihan.

Pengurutan Hasil

Amazon DocumentDB tidak menjamin pengurutan kategori hasil secara impilisit dari kumpulan hasil. Untuk memastikan pengurutan kumpulan hasil, tentukan pengurutan kategori secara eksplisit dengan menggunakan

rs0:PRIMARY< db.foo.insert({"a":{"$a":1}})
3.

Contoh berikut mengategorikan item dalam koleksi inventaris dalam urutan menurun berdasarkan bidang stok.

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
2

Saat menggunakan tahap agregasi

rs0:PRIMARY< db.foo.insert({"a":{"$a":1}})
4, urutan kategori tidak dipertahankan kecuali jika tahap
rs0:PRIMARY< db.foo.insert({"a":{"$a":1}})
4 tersebut adalah tahap terakhir dalam alur agregasi. Saat menggunakan tahap agregasi
rs0:PRIMARY< db.foo.insert({"a":{"$a":1}})
4 bersama dengan tahap agregasi
rs0:PRIMARY< db.foo.insert({"a":{"$a":1}})
7, tahap agregasi
rs0:PRIMARY< db.foo.insert({"a":{"$a":1}})
4 hanya diterapkan pada akumulator
rs0:PRIMARY< db.foo.insert({"a":{"$a":1}})
9 dan
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
00. Di Amazon DocumentDB 4.0, dukungan ditambahkan untuk
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
01 sesuai pengurutan kategori dari tahap
rs0:PRIMARY< db.foo.insert({"a":{"$a":1}})
4 sebelumnya.

Penulisan yang dapat dicoba lagi

Dimulai dengan driver yang kompatibel dengan MongoDB 4.2, penulisan yang dapat dicoba kembali diaktifkan secara default. Namun, Amazon DocumentDB saat ini tidak mendukung penulisan yang dapat dicoba lagi. Perbedaan fungsional akan memanifestasikan dirinya dalam pesan kesalahan yang mirip dengan hal berikut ini.

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
3

Penulisan yang dapat diulang dapat dinonaktifkan melalui string koneksi (misalnya,

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
03atau MongoClient argumen kata kunci konstruktor (misalnya,
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
04.

Berikut ini adalah contoh Python yang menonaktifkan penulisan yang dapat dicoba lagi dalam string koneksi.

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
4

Indeks Jarang

Untuk menggunakan indeks jarang yang telah Anda buat dalam kueri, Anda harus menggunakan klausa

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
05 pada bidang yang mencakup indeks tersebut. Jika Anda menghilangkan
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
05, Amazon DocumentDB tidak menggunakan indeks jarang.

Berikut ini adalah contoh.

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
5

Untuk indeks multi-kunci yang jarang, Amazon DocumentDB tidak mendukung batasan kunci unik jika pencarian dokumen menghasilkan sekumpulan nilai dan hanya sebagian dari bidang yang diindeks yang hilang. Misalnya,

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
07 tidak didukung, mengingat input
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
08, seperti
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
09 yang disimpan dalam indeks.

Kompresi Penyimpanan

Amazon DocumentDB saat ini tidak mendukung kompresi untuk data atau indeks yang disimpan. Ukuran data untuk data dan indeks yang disimpan mungkin lebih besar daripada saat Anda menggunakan opsi lain.

Menggunakan $elemMatch Dalam Ekspresi $all

Amazon DocumentDB saat ini tidak mendukung penggunaan operator

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
10 dalam ekspresi
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
11. Sebagai solusinya, Anda dapat menggunakan operator
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
12 dengan
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
10 sebagai berikut.

Operasi asli:

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
6

Operasi yang diperbarui:

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
7

Pengindeksan db.miles.updateMany( { "credit_card": { $eq: true } }, { $mul: { "flight_miles.$[]": NumberInt(2) } } ) 14, db.miles.updateMany( { "credit_card": { $eq: true } }, { $mul: { "flight_miles.$[]": NumberInt(2) } } ) 15, db.miles.updateMany( { "credit_card": { $eq: true } }, { $mul: { "flight_miles.$[]": NumberInt(2) } } ) 16, db.miles.updateMany( { "credit_card": { $eq: true } }, { $mul: { "flight_miles.$[]": NumberInt(2) } } ) 17, db.miles.updateMany( { "credit_card": { $eq: true } }, { $mul: { "flight_miles.$[]": NumberInt(2) } } ) 05, dan db.miles.updateMany( { "credit_card": { $eq: true } }, { $mul: { "flight_miles.$[]": NumberInt(2) } } ) 10

Amazon DocumentDB saat ini tidak mendukung kemampuan untuk menggunakan indeks dengan

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
14,
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
15,
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
16,
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
17,
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
05,
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
25, dan
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
10Operator Dengan memanfaatkan operator ini, pemindaian pengumpulan akan dilakukan. Melakukan filter atau pencocokan sebelum menggunakan salah satu operator ini akan mengurangi jumlah data yang perlu dipindai, dan dengan demikian dapat meningkatkan kinerja.

db.miles.updateMany( { "credit_card": { $eq: true } }, { $mul: { "flight_miles.$[]": NumberInt(2) } } ) 27

Amazon DocumentDB mendukung kemampuan untuk melakukan pencocokan kesetaraan (misalnya, gabungan luar kiri) tetapi tidak mendukung subkueri yang tidak berkorelasi.

Memanfaatkan indeks dengan
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
27

Anda sekarang dapat menggunakan indeks dengan operator tahapan

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
27. Berdasarkan kasus penggunaan Anda, ada beberapa algoritme pengindeksan yang dapat Anda gunakan untuk mengoptimalkan kinerja. Bagian ini akan menjelaskan berbagai algoritme pengindeksan untuk
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
27 dan membantu Anda memilih yang terbaik untuk beban kerja Anda.

Secara default, Amazon DocumentDB akan menggunakan algoritme hash saat

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
31 digunakan dan mengurutkan gabungan saat
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
32 digunakan. Untuk beberapa kasus penggunaan, akan lebih bermanfaat jika pengoptimal kueri didesak untuk menggunakan algoritme yang berbeda. Di bawah ini adalah berbagai algoritma pengindeksan yang dapat digunakan oleh operator agregasi
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
27:

  • Loop Bersarang: A nested loop plan is typically beneficial for a workload if the foreign collection is <1 GB and the field in the foreign collection has an index. If the nested loop algorithm is being used, the explain plan will show the stage as
    db.miles.updateMany(
        { "credit_card": { $eq: true } }, 
        { $mul: { "flight_miles.$[]": NumberInt(2) } }
    )
             
    34.
  • Penggabungan urutan: A sort merge plan is typically beneficial for a workload if the foreign collection does not have an index on the field used in lookup and the working dataset doesn’t fit in memory. If the sort merge algorithm is being used, the explain plan will show the stage as
    db.miles.updateMany(
        { "credit_card": { $eq: true } }, 
        { $mul: { "flight_miles.$[]": NumberInt(2) } }
    )
             
    35.
  • Hash: A hash plan is typically beneficial for a workload if the foreign collection is < 1GB and the working dataset fits in memory. If the hash algorithm is being used, the explain plan will show the stage as
    db.miles.updateMany(
        { "credit_card": { $eq: true } }, 
        { $mul: { "flight_miles.$[]": NumberInt(2) } }
    )
             
    36.

Anda dapat mengidentifikasi algoritme pengindeksan yang digunakan untuk operator

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
27 dengan menggunakan penjelasan pada kueri. Berikut adalah contoh.

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
8

Sebagai alternatif terhadap penggunaan metode

db.collection.getIndexes()
0 ini, Anda dapat menggunakan profiler untuk meninjau algoritme yang digunakan saat Anda menggunakan operator
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
27. Untuk informasi lebih lanjut tentang profiler, silakan lihat Membuat Profil Operasi Amazon DocumentDB.

Menggunakan
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
40

Jika Anda ingin memaksa pengoptimal kueri untuk menggunakan algoritme pengindeksan yang berbeda dengan

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
27, Anda dapat menggunakan
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
40. Untuk melakukannya, gunakan komentar dalam opsi tahap agregasi untuk memaksa rencana yang berbeda. Di bawah ini adalah contoh sintaks untuk komentar:

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
9

Di bawah ini adalah contoh penggunaan

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
40 untuk memaksa pengoptimal kueri untuk menggunakan algoritme pengindeksan
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
44:

db.runCommand({
  update: "miles",
  updates: [
    {
      q: { "credit_card": { $eq: true } },
      u: { $mul: { "flight_miles.$[]": NumberInt(2) } },
      multi: true
    }
  ]
})
         
0

Untuk menguji algoritme mana yang terbaik untuk beban kerja Anda, Anda dapat menggunakan parameter

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
45 dari metode
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
46 untuk mengukur waktu eksekusi tahapan
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
27 saat memodifikasi algoritme pengindeksan (yaitu,
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
44/
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
49/
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
50).

Contoh berikut menunjukkan cara menggunakan

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
45 untuk mengukur waktu eksekusi tahap
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
27 dengan menggunakan algoritme
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
49.