Topik ini menjelaskan perubahan kompatibilitas di MongoDB 3.4.
Untuk melihat dokumentasi resmi perubahan kompatibilitas MongoDB, kunjungi Dokumentasi Lama.
Perubahan pada instance kluster sharding
Peran anggota eksplisit
Pada instance kluster sharding yang menjalankan MongoDB 3.4, semua instance mongod dalam shard harus secara eksplisit mendeklarasikan peran mereka sebagai shardsvr melalui salah satu metode berikut:
File konfigurasi: Tentukan
sharding.clusterRole: shardsvr.Baris perintah: Gunakan opsi
--shardsvr.
Port default untuk instance mongod dengan peran shardsvr adalah 27018. Untuk menggunakan port lain, atur opsi konfigurasi net.port atau parameter --port ke port tersebut.
Batasan kompatibilitas
Instance mongos yang menjalankan MongoDB 3.4 tidak dapat terhubung ke instance mongod yang menjalankan versi sebelumnya.
Penghapusan opsi konfigurasi
MongoDB 3.4 menghapus opsi konfigurasi berikut dari mongos:
Konfigurasi ukuran chunk:
Opsi file konfigurasi
sharding.chunkSize.Opsi baris perintah
--chunkSize.
Konfigurasi pemisahan otomatis:
Opsi file konfigurasi
sharding.autoSplit.Opsi baris perintah
--noAutoSplit.
Penghapusan server konfigurasi SCCC
Mulai dari MongoDB 3.4, instance kluster sharding tidak lagi mendukung instance mongod yang dicerminkan (SCCC) sebagai server konfigurasi. Mode ini sudah ditinggalkan di MongoDB 3.2.
Anda harus mengimplementasikan server konfigurasi dalam mode set replika (CSRS). Untuk meningkatkan instance kluster sharding Anda ke MongoDB 3.4, server konfigurasi harus memenuhi persyaratan berikut:
Harus berjalan dalam mode CSRS.
Jika dalam mode SCCC, Anda dapat mengubahnya ke mode CSRS.
Kompatibilitas penggantian nama koleksi dengan sinkronisasi awal
Jika sebuah koleksi, sebagai sumber sinkronisasi, diganti namanya selama sinkronisasi awal, proses sinkronisasi awal gagal dan dimulai ulang, sehingga menghindari risiko potensi kerusakan data. Untuk informasi lebih lanjut, lihat SERVER-26117.
Operasi berikut mencakup penggantian nama koleksi:
Perintah
renameCollection: seperti metodedb.collection.renameCollection().Tahap
$outdalam operasi agregasi, seperti menggunakan metodedb.collection.aggregate()atau perintahaggregatedengan tahap$out.Opsi
outdalam MapReduce, seperti menggunakan metodedb.collection.mapReduce()atau perintahmapReducedengan opsioutyang ditentukan.Perintah
convertToCappedyang digunakan untuk mengonversi koleksi biasa menjadi koleksi capped.
Saat Anda meningkatkan dari MongoDB 3.2.11 atau lebih lama ke 3.4, sinkronisasi awal mungkin gagal jika menemui operasi penggantian nama koleksi.
Sebelum MongoDB v3.2.11, proses sinkronisasi awal berlanjut saat menemui operasi penggantian nama koleksi yang dapat merusak data. Untuk informasi lebih lanjut, lihat SERVER-4941.
Operasi yang ditinggalkan
Perintah group
Mulai dari MongoDB 3.4, perintah group dan metode shell mongo db.collection.group() sudah ditinggalkan. Gunakan db.collection.aggregate() atau db.collection.mapReduce() sebagai gantinya.
Perintah aggregate tanpa informasi kursor
Mulai dari MongoDB 3.6, output dari perintah aggregate harus mencakup kursor dalam opsi cursor, kecuali opsi explain ditentukan untuk menganalisis rencana eksekusi.
Untuk menunjukkan kursor dengan ukuran batch default, tentukan cursor:
{}.Untuk menunjukkan kursor dengan ukuran batch non-default, gunakan
cursor: { batchSize: <num> }.
Spesifikasi koleksi dan indeks
Validasi opsi koleksi
Mulai MongoDB 3.4, perintah create dan operasi db.createCollection() melakukan validasi lebih ketat terhadap opsi koleksi. Gunakan opsi yang valid dan didukung oleh create atau db.createCollection().
Sebagai contoh, operasi berikut tidak lagi valid karena mencakup opsi yang tidak valid cappedtypo:
db.createCollection( "myCappedCollection", { cappedtypo: true, size: 5242880 } )Validasi spesifikasi indeks
Mulai dari MongoDB 3.4, perintah createIndexes dan metode db.collection.createIndex() melakukan validasi yang lebih ketat saat Anda membuat indeks. Validasi yang lebih ketat ini tidak berlaku pada indeks yang ada. Aturan validasi berikut berlaku:
Pastikan bahwa
valuedalam pola kunci indekskey: valuevalid. Nilai yang diizinkan:Nilai
Deskripsi
Nomor > 0
Untuk indeks naik.
Nomor < 0
Untuk indeks turun.
String
Untuk tipe indeks khusus, hanya "text", "2dsphere", "2d", dan "hashed" yang diizinkan.
Contohnya, operasi berikut tidak lagi valid:
db.collection.createIndex( { x: 0 } ); db.collection.createIndex( { y: "text2d" } ); db.collection.createIndex( { z: NaN } ); db.collection.createIndex( { x: 1, unique: true } )Pastikan bahwa opsi indeks yang ditentukan valid. Sebelum MongoDB 3.4, opsi indeks tidak valid diabaikan. Namun, mulai dari MongoDB 3.4, MongoDB melaporkan kesalahan jika Anda menentukan opsi indeks tidak valid. Contohnya, operasi berikut tidak lagi valid:
db.collection.createIndex( { y: 1 }, { uniques2: true} ); db.collection.createIndex( { z: 1 }, { expireAfterSec: 350 } )
Perubahan kompatibilitas umum
Penyesuaian batas namespace: Mulai MongoDB 3.4, nama database tidak lagi mendukung simbol
$.CatatanSebelum meningkatkan ke MongoDB 3.4, Anda harus menghapus semua database yang namanya mengandung
$.Penghapusan parameter
textSearchEnabled. Mulai dari MongoDB 2.6, MongoDB mengaktifkan pencarian teks secara default.Penghapusan alat
mongosniff: Mulai dari MongoDB 3.4,mongosniffdigantikan oleh alatmongoreplayyang menyediakan fitur lebih kuat dan mendukung penangkapan dan analisis lalu lintas jaringan yang lebih fleksibel.Perubahan perilaku pada tahap agregasi
$project: Jika tahap$projectmenghasilkan dokumen kosong (tidak ada bidang yang dipertahankan atau ditambahkan), kesalahan akan dilaporkan.Masalah penghitungan petunjuk dan indeks jarang: Jika Anda menggunakan
hint()untuk menentukan indeks jarang saat menghitung dokumen dalam koleksi (dengan predikat kueri kosong), indeks jarang dapat mengakibatkan hasil penghitungan yang tidak akurat.db.collection.insert({ _id: 1, y: 1 } ); db.collection.createIndex( { x: 1 }, { sparse: true } ); db.collection.find().hint( { x: 1 } ).count();Untuk mendapatkan hasil penghitungan yang benar, jangan tentukan indeks jarang dalam
hint()saat menghitung semua dokumen dalam koleksi.db.collection.find().count(); db.collection.createIndex({ y: 1 }); db.collection.find().hint({ y: 1 }).count();Sebelum MongoDB 3.4, petunjuk diabaikan jika penggunaan indeks jarang menyebabkan hasil penghitungan hilang.
Perubahan izin peran pengguna
Mulai dari MongoDB 3.4, izin dari peran bawaan berikut tidak lagi berlaku untuk database local dan config:
Nama Peran | Deskripsi |
readAnyDatabase | Untuk memberikan izin baca pada database lokal, buat pengguna di database admin dan tetapkan secara eksplisit peran baca database lokal kepada pengguna. Alternatifnya, akses database config dan local dengan peran clusterManager atau clusterMonitor. |
readWriteAnyDatabase | Untuk memberikan izin baca/tulis pada database lokal, buat pengguna di database admin dan tetapkan secara eksplisit peran readWrite database lokal kepada pengguna. |
userAdminAnyDatabase | Tidak tersedia. |
dbAdminAnyDatabase | Untuk memberikan izin administratif pada database lokal, buat pengguna di database admin dan tetapkan secara eksplisit peran dbAdmin database lokal kepada pengguna. |
Peran bawaan berikut memiliki izin pada database local dan config:
clusterManager
clusterMonitor
backup
restore
Fitur tidak kompatibel dengan versi selanjutnya
MongoDB 3.4 memperkenalkan fitur berikut yang menyimpan data yang tidak diproses dengan benar oleh versi sebelumnya. Untuk mengaktifkan fitur ini, atur featureCompatibilityVersion ke "3.4".
Tampilan
Collation dan indeks case-insensitive
Tipe desimal
Versi indeks v2
Mendukung collation dan tipe data desimal.
Saat
featureCompatibilityVersiondiatur ke "3.4", versi default indeks baru adalah v2. Jika tidak, versi default adalah v1.
Setelah diaktifkan, fitur tidak kompatibel ini mempersulit proses unduhan.
Untuk meminimalkan kemungkinan downgrade, kami sarankan agar Anda membiarkan penerapan Anda berjalan tanpa mengaktifkan fitur ini setelah peningkatan. Aktifkan fitur ini hanya jika Anda yakin bahwa kemungkinan downgrade minimal.
Nilai default untuk featureCompatibilityVersion:
Penyebaran baru MongoDB 3.4: "3.4".
Penyebaran yang ditingkatkan dari MongoDB 3.2: "3.2" (perlu diatur secara manual ke "3.4").
Sebelum MongoDB 3.4, jika database berisi tampilan, definisi collation, atau indeks v2, MongoDB tidak dapat dimulai. Jika ada bidang tipe desimal, operasi untuk dokumen-dokumen ini mungkin gagal.
Untuk peningkatan ke MongoDB 3.4, Anda harus membersihkan semua data tidak kompatibel, termasuk tampilan, indeks v2, dan bidang desimal.
Perubahan kompatibilitas driver
Untuk menggunakan fitur baru yang diperkenalkan di MongoDB 3.4 (seperti tipe desimal dan collation), Anda harus meningkatkan driver Anda ke versi yang mendukung fitur-fitur ini.
Perubahan perilaku $in elemen tunggal dan upsert
Ketika operasi upsert tidak menemukan dokumen yang sesuai, ia membuat dokumen dasar untuk upsert berdasarkan pernyataan kesetaraan dalam predikat kueri dan menerapkan operator pembaruan pada dokumen tersebut. Contoh:
db.c.drop()
db.c.update( { a : 3, b: "foo" }, { $set : { c : 15 } }, { upsert : true } )
db.c.find()
{ "_id" : ObjectId("59c03009529946822d0afb8c"), "a" : 3, "b" : "foo", "c" : 15 }Sebelum MongoDB 3.4, $in elemen tunggal tidak menginisialisasi bidang.
db.c.drop()
db.c.update( { a : { $in : [1] } }, { $addToSet : { a : 2 } }, { upsert : true } )
db.c.find()
{ "_id" : ObjectId("58bdb00eb39e8f87607e9222"), "a" : [ 2 ] }Mulai MongoDB 3.4, elemen tunggal $in diperlakukan sebagai pernyataan kesetaraan untuk upsert.
Jika predikat kueri mencakup
$inelemen tunggal, bidang diinisialisasi sebagai bidang skalar daripada array.Operasi
$addToSetdalam contoh sebelumnya gagal karena operator array tidak dapat diterapkan pada bidang skalar.
Solusi: Bungkus ekspresi $in dalam $elemMatch untuk mempertahankan tipe array dari bidang tersebut.
db.c.drop()
db.c.update(
{ a : { $elemMatch : { $in : [ 2 ] } } },
{ $addToSet : { a: 3 } },
{ upsert: true } )
db.c.find()
{ "_id" : ObjectId("..."), "a" : [ 3 ] }