全部产品
Search
文档中心

:Perubahan kompatibilitas di MongoDB 3.6

更新时间:Jun 27, 2025

Bagian ini menjelaskan perubahan kompatibilitas di MongoDB 3.6.

Untuk dokumentasi resmi tentang perubahan kompatibilitas MongoDB, kunjungi Dokumentasi Lama.

Perubahan kompatibilitas pengikatan Localhost

Mulai MongoDB 3.6, file biner mongod dan mongos secara default terikat ke localhost. Jika parameter net.ipv6 disetel dalam file konfigurasi atau dukungan IPv6 diaktifkan melalui opsi baris perintah --ipv6, file biner tersebut terikat pada alamat IPv6 dari localhost.

Mulai MongoDB 2.6, hanya file biner dari paket RPM MongoDB resmi (untuk Red Hat, CentOS, Fedora Linux, dan turunannya) serta paket DEB (untuk Debian, Ubuntu, dan turunannya) yang terikat ke localhost secara default.

Ketika hanya terikat ke localhost, file biner MongoDB 3.6 hanya menerima koneksi dari klien (termasuk mongo shell, anggota instance set replika, atau node dalam instance kluster sharded) pada mesin yang sama. Klien jarak jauh tidak dapat terhubung ke file biner yang terikat hanya ke localhost.

Untuk menimpa perilaku default dan mengikat file biner ke alamat IP lain, gunakan parameter net.bindIp dalam file konfigurasi atau opsi baris perintah --bind_ip untuk menentukan daftar nama host atau alamat IP.

Penting

Sebelum mengikat ke non-localhost (seperti alamat IP yang dapat diakses publik), pastikan Anda telah mengamankan kluster terhadap akses tidak sah. Untuk mengamankan kluster, aktifkan otentikasi dan perkuat infrastruktur jaringan Anda.

Sebagai contoh, instance mongod berikut terikat ke localhost dan nama host My-Example-Associated-Hostname. Nama host tersebut dikaitkan dengan alamat IP 198.51.100.1.

mongod --bind_ip localhost,My-Example-Associated-Hostname

Untuk terhubung ke instance ini, klien jarak jauh harus menentukan nama host atau alamat IP-nya, yaitu 198.51.100.1.

mongo --host My-Example-Associated-Hostname

mongo --host 198.51.100.1

Instance kluster sharded

Mulai MongoDB 3.6, shard harus menggunakan arsitektur set replika. Untuk meningkatkan instance kluster sharded ke MongoDB 3.6, semua server shard harus berjalan sebagai set replika.

API HTTP dan REST API

Mulai MongoDB 3.6, MongoDB menghapus API HTTP dan REST API.

Konfigurasi

Opsi mongod/mongos

net.http.enabled

httpinterface

net.http.JSONPEnabled

nohttpinterface

net.http.port

jsonp

net.http.RESTInterfaceEnabled

rest

Pembaruan alat

MongoDB 3.6 menghapus alat mongooplog.

Perubahan kompatibilitas operasi array

Perubahan perilaku $type: "array"

Mulai MongoDB 3.6, ekspresi type: "array" dan $type: 4 cocok dengan bidang array yang berisi elemen tipe apa pun.

Sebelum MongoDB 3.6, $type: "array" hanya cocok dengan bidang array yang berisi array bersarang.

Sebagai contoh, koleksi bernama c berisi dokumen-dokumen berikut:

{ "_id": 1, "a": [ 1, 2, 3 ] },
{ "_id": 2, "a": [ 1, 2, [ 3, 4 ] ] }

Operasi berikut meminta data berdasarkan tipe bidang a:

db.c.find( { "a": { $type : "array" } } )

Mulai MongoDB 3.6, query $type mengembalikan dua dokumen dalam koleksi karena query sekarang mendeteksi bahwa bidang a adalah sebuah array.

{ "_id": 1, "a": [ 1, 2, 3 ] },
{ "_id": 2, "a": [ 1, 2, [ 3, 4 ] ] }

Sebelum MongoDB 3.4, query $type hanya mengembalikan dokumen di mana bidang a berisi elemen-elemen tipe array BSON.

{ "_id": 2, "a": [ 1, 2, [ 3, 4 ] ] }

Jika instance saat ini menjalankan MongoDB 3.4.x dan Anda menggunakan indeks parsial yangpartialFilterExpression berisi $type: "array" atau $type: 4, Anda harus membangun ulang indeks-indeks ini setelah peningkatan ke MongoDB 3.6, sehingga menghindari konflik akibat perubahan semantik dalam $type: 'array'.

Perubahan perilaku pengurutan array

Mulai MongoDB 3.6, ketika mengurutkan pada bidang array, MongoDB menggunakan elemen array bernilai terendah untuk kunci pengurutan naik dan elemen array bernilai tertinggi untuk kunci pengurutan turun. Pengurutan tidak lagi mempertimbangkan predikat query ketika memilih elemen array sebagai kunci pengurutan. Perubahan perilaku ini berlaku untuk perintah find dan operasi pipeline agregasi.

Akibatnya, aplikasi yang mengurutkan pada bidang array mungkin mengembalikan hasil pengurutan yang berbeda.

Catatan

Akibat penyesuaian lebih lanjut terhadap perilaku pengurutan oleh bidang array di MongoDB 4.4, ketika Anda mengurutkan pada bidang array dengan indeks multikey, rencana query mencakup tahap pengurutan pemblokiran kecuali:

  • Batas indeks semua bidang sort adalah [MinKey, MaxKey].

  • Tidak ada batas untuk bidang apa pun yang diindeks-multikey memiliki awalan jalur yang sama dengan pola sortir.

Perubahan perilaku metode find dalam pengurutan

Dalam MongoDB, kunci sortir adalah elemen array yang digunakan MongoDB selama proses pengurutan untuk membandingkan dokumen dengan bidang array. Dalam pengurutan naik, dokumen yang berisi array dengan kunci sortir bernilai terendah dipesan pertama. Dalam pengurutan turun, dokumen yang berisi array dengan kunci sortir bernilai tertinggi dipesan pertama.

Perbedaan perilaku pengurutan antara versi:

  • Sebelum MongoDB 3.4: pengurutan pada bidang array mempertimbangkan predikat query ketika menentukan kunci sortir.

  • Mulai MongoDB 3.6: Pengurutan pada bidang array tidak lagi mempertimbangkan predikat query ketika menentukan kunci sortir. Sebaliknya, kunci sortir adalah elemen bernilai terendah atau tertinggi dalam array.

Jika aplikasi Anda ditingkatkan ke MongoDB 3.6 mengurutkan pada bidang array dan menggunakan predikat query, Anda harus memverifikasi apakah logika pengurutan dipengaruhi oleh perubahan perilaku dan menyesuaikan kode Anda untuk memastikan kompatibilitas.

Contoh:

Anggaplah koleksi bernama coll berisi dokumen-dokumen berikut:

{ _id: 0, a: [-3, -2, 2, 3] }
{ _id: 1, a: [ 5, -4 ] }

Jalankan query dan operasi pengurutan untuk bidang array a:

db.coll.find({a: {$gte: 0}}).sort({a: 1});
  • Dalam MongoDB 3.6, kunci sortir adalah elemen bernilai terendah dalam array (mengabaikan predikat query):

    • Elemen bernilai terendah dalam array a untuk dokumen dengan _id: 0 adalah -3.

    • Elemen bernilai terendah dalam array a untuk dokumen dengan _id: 1 adalah -4.

    Hasil berikut dikembalikan dalam urutan menaik:

    { "_id" : 1, "a" : [ 5, -4 ] }
    { "_id" : 0, "a" : [ -3, -2, 2, 3 ] }
  • Sebelum MongoDB 3.4, kunci sortir adalah elemen bernilai terendah yang cocok dengan predikat query {$gte: 0}:

    • Elemen yang cocok untuk dokumen dengan _id: 0 adalah [2, 3], dan elemen bernilai terendah "2" digunakan sebagai kunci sortir untuk dokumen tersebut.

    • Elemen yang cocok untuk dokumen dengan _id: 1 adalah [5], dan elemen bernilai terendah "5" digunakan sebagai kunci sortir untuk dokumen tersebut.

    Hasil berikut dikembalikan dalam urutan menaik:

    { _id: 0, a: [-3, -2, 2, 3] }
    { _id: 1, a: [ 5, -4 ] }

Perubahan perilaku pengurutan metode agregasi

Mulai MongoDB 3.6, ketika Anda menggunakan db.collection.aggregate() untuk mengurutkan pada bidang array, hanya satu elemen dalam array yang digunakan sebagai kunci sortir.

Contoh:

// Dokumen.
{ "_id" : 1, "timestamps" : [ ISODate("2017-07-15T15:31:01Z"), ISODate("2017-07-21T18:31:01Z") ] }
{ "_id" : 0, "timestamps" : [ ISODate("2017-07-21T15:31:01Z"), ISODate("2017-07-21T13:31:01Z") ] }

// Query.
db.c.aggregate([{$sort: {timestamps: -1}}])

Pada MongoDB 3.6:

  • Untuk pengurutan turun, waktu paling baru dalam array digunakan sebagai kunci sortir:

    • 3:31 PM pada 21 Juli untuk dokumen dengan _id: 0, dan

    • 5:31 PM pada 21 Juli untuk dokumen dengan _id: 1.

  • Pengurutan dalam urutan turun. Oleh karena itu, kunci-kunci ini diurutkan dari yang paling baru ke yang paling lama, menghasilkan dokumen dengan _id: 1 disortir sebelum dokumen dengan _id: 0.

Sebelum MongoDB 3.6, seluruh array digunakan sebagai kunci sortir untuk pengurutan agregasi. Kunci sortir array dibandingkan elemen demi elemen untuk menentukan urutan sortir dari set hasil.

// Dokumen.
{_id: 0, a: [3, 1, 5]}
{_id: 1, a: [3, 4, 0]}

// Query.
db.coll.aggregate([{$sort: {a: 1}}])

Sebelum MongoDB 3.6, kunci sortir adalah [3,1,5] dan [3,4,0] masing-masing.

  • Elemen array pertama dalam kedua kunci sama (3). Kemudian, elemen array kedua dibandingkan (1 < 4).

  • Akibatnya, dokumen dengan _id: 0 disortir sebelum dokumen dengan _id: 1.

Batas pengurutan majemuk pada beberapa bidang array dalam pipeline agregasi

Mulai MongoDB 3.6, ketika mengurutkan dalam pipeline agregasi, MongoDB tidak lagi dapat mengurutkan dokumen yang berisi array paralel dalam file sortir. Array dianggap paralel jika mereka adalah elemen saudara dari objek BSON. Array tidak dianggap paralel dalam situasi berikut:

  • Kunci sortir berisi array bersarang, seperti jalur bidang dengan hubungan hierarkis.

  • Kunci sortir berbagi array yang sama sebagai awalan jalur.

Catatan

Batas-batas ini selalu ada dalam perintah find. Namun, find dan aggregate berbagi semantik yang sama di MongoDB 3.6 dan versi selanjutnya.

  • Contoh 1: Pengurutan berhasil jika array bersarang ada.

    Sebuah koleksi berisi dokumen-dokumen berikut:

    {a: [ {b: [1, 2]}, {b: [3, 4]} ]}

    Jalankan operasi agregasi berikut (kunci sortir adalah bidang array bersarang):

    db.coll.aggregate([{$sort: {"a.b": 1}}])

    Operasi berhasil karena a.b adalah bidang array bersarang dan tidak membentuk array paralel.

  • Contoh 2: Pengurutan berhasil jika kunci sortir berbagi array yang sama sebagai awalan.

    Sebuah koleksi berisi dokumen-dokumen berikut:

    {a: [{b: 1, c: 1}, {b: 2, c: 2}]}

    Jalankan operasi agregasi berikut (kunci sortir berbagi array yang sama sebagai awalan):

    db.coll.aggregate([{$sort: {"a.b": 1, "a.c": 1}}])

    Operasi berhasil karena a.b dan a.c berbagi awalan a dan tidak dianggap sebagai array paralel.

  • Contoh 3: Kunci sortir saudara menyebabkan pengurutan gagal.

    Sebuah koleksi berisi dokumen-dokumen berikut:

    { _id: 1, a: [ 1, 2 ], b: [ 1, 2 ]}
    { _id: 2, a: [ -3, 5 ], b: 0 }
    { _id: 3, a: [ -6, 12 ], b: 100 }

    Jalankan operasi agregasi berikut (kunci sortir adalah bidang array saudara):

    db.coll.aggregate([ { $sort: {a: 1, b: 1} } ])

    MongoDB tidak dapat mengurutkan pada bidang a dan b karena mereka adalah array saudara dan membentuk array paralel dalam dokumen dengan _id: 1. Untuk melakukan pengurutan majemuk pada beberapa bidang array, pastikan bidang sortir adalah array bersarang atau berbagi array yang sama sebagai awalan, dan hindari menggunakan tipe array dalam bidang saudara dalam model data Anda.

Pembaruan operasi pembaruan

Pembaruan bidang baru

Mulai MongoDB 3.6, bidang yang ditambahkan selama operasi pembaruan ditambahkan dalam urutan leksikografis.

Sebagai contoh, koleksi bernama coll berisi dokumen berikut:

{ _id: 0, x: 0 }

Jalankan operasi pembaruan untuk menambahkan bidang-bidang berikut:

db.coll.update({_id: 0}, {$set: {b: 0, a: 0}})

Dalam MongoDB 3.6, bidang baru ditambahkan dalam urutan leksikografis. Akibatnya, dokumen yang diperbarui adalah {_id: 0, x: 0, a: 0, b: 0}.

Sebelum MongoDB 3.6, bidang baru ditambahkan dalam urutan kemunculan mereka dalam dokumen pembaruan. Akibatnya, dokumen yang diperbarui adalah {_id: 0, x: 0, b: 0, a: 0}.

Bidang yang bertentangan dengan sintaks identifier arrayFilters

Mulai MongoDB 3.6, bidang yang namanya bertentangan dengan sintaks identifier arrayFilters (seperti $[]) tidak dapat diperbarui lagi.

Sebagai contoh, koleksi bernama coll berisi dokumen berikut:

{ _id: 0, x: { "$[]": 0 } }

Jalankan operasi pembaruan:

db.coll.update({_id: 0}, {$set: {"x.$[]": 1}})

Mulai MongoDB 3.6, operasi pembaruan berhasil. Di MongoDB 3.6, operasi pembaruan gagal karena nama bidang $[] bertentangan dengan sintaks identifier arrayFilters.

Catatan

Perilaku pembaruan baru ini hanya berlaku ketika featureCompatibilityVersion disetel ke 3.6.

Validasi yang lebih ketat dari operator $pop

Mulai MongoDB 3.6, parameter operator $pop harus disetel ke salah satu nilai berikut:

  • -1: menghapus elemen pertama dari array, atau

  • 1: menghapus elemen terakhir dari array.

Sebelum MongoDB 3.6:

  • Nomor negatif untuk menghapus elemen pertama dari array, atau

  • Nomor non-negatif atau nilai non-numerik untuk menghapus elemen terakhir dari array.

Penghapusan operator $pushAll

MongoDB 3.6 menghapus operator $pushAll (usang sejak MongoDB 2.4).

Gunakan operator $push dan $each sebagai gantinya. Contoh:

db.students.update(
   { name: "joe" },
   { $push: { scores: { $each: [ 90, 92, 85 ] } } }
)

Perubahan dukungan platform

  • MongoDB 3.6 tidak lagi mendukung versi Windows sebelum Window Server 2008 R2 dan Windows 7.

  • MongoDB 3.6 tidak diuji pada APFS, sistem file baru di macOS 10.13+ dan mungkin mengalami masalah kompatibilitas.

Pembaruan kompatibilitas umum

Penghapusan mekanisme otentikasi MongoDB-CR

Mulai MongoDB 3.6, MongoDB menghapus mekanisme otentikasi MONGODB-CR. Jika belum, tingkatkan skema otentikasi MONGODB-CR Anda ke SCRAM.

Node arbiter dan prioritasnya

Semua node arbiter memiliki prioritas tetap 0.

Penghapusan arsitektur replikasi master-slave

MongoDB 3.6 secara resmi menghapus arsitektur replikasi master-slave.

Penghapusan opsi --nojournal untuk mesin penyimpanan WiredTiger

MongoDB 3.6 menghapus opsi --nojournal untuk anggota Replica Set yang menggunakan mesin penyimpanan WiredTiger, sehingga mengurangi risiko kehilangan data.

Penyesuaian terhadap perintah aggregate dan keluarannya

Mulai MongoDB 3.6, perintah aggregate tidak lagi mengembalikan hasil sebagai dokumen tunggal.

Saat menjalankan perintah aggregate, Anda harus menentukan salah satu opsi berikut:

  • cursor: mengembalikan hasil sebagai kursor (cocok untuk dataset besar).

  • explain: mengembalikan analisis rencana eksekusi untuk pipeline agregasi.

Kami merekomendasikan Anda menggunakan db.collection.aggregate() dalam mongo shell atau metode setara dalam driver Anda. Metode-metode ini mengembalikan kursor secara default kecuali opsi explain digunakan.

Perubahan konversi dari bidang tanggal ke string dalam ekspresi agregasi

Mulai MongoDB 3.6, MongoDB secara paksa mengonversi tanggal menjadi string yang berisi presisi milidetik dan diakhiri dengan huruf 'Z' (menunjukkan zona waktu UTC) dalam ekspresi agregasi.

Contoh:

// Dokumen.
{_id: 0, d: ISODate("2017-10-18T20:04:27.978Z")}
{_id: 1, d: ISODate("2017-10-18T20:04:28.192Z")}

// Query.
db.coll.aggregate({$project: {d: {$toLower: "$d"}}})

Sebelum MongoDB 3.6, bidang data dalam dua dokumen dikembalikan sebagai string dalam format "2017-10-18t20:04:27" dan "2017-10-18t20:04:28".

Mulai MongoDB 3.6, bidang data dalam dua dokumen dikembalikan sebagai string dalam format "2017-10-18t20:04:27.978z" dan "2017-10-18t20:04:28.192z" (termasuk milidetik dan huruf 'z' kecil).

Perubahan ini berlaku untuk operator agregasi berikut:

  • $concat

  • $substr

  • $substrBytes

  • $substrCP

  • $strcasecmp

  • $toLower

  • $toUpper

Penghapusan perintah dan opsi diagnostik log

MongoDB 3.6 menghapus perintah diagLogging yang sudah usang dan opsi mongod --diaglog.

Sebagai gantinya, gunakan alat mongoreplay untuk menangkap, memutar ulang, dan menganalisis perintah yang dikirim ke penerapan MongoDB Anda.

Perubahan operasi validate

Mulai MongoDB 3.6, operasi validate secara paksa memicu checkpoint dan menyiram semua data dalam memori ke disk hanya sebelum menjalankan validasi untuk data disk.

Sebelum MongoDB 3.6, checkpoint dipicu secara paksa tanpa mempertimbangkan mode validasi yang digunakan.

Saat menggunakan perintah validate atau metode db.collection.validate(), tentukan secara eksplisit {full: true} untuk melakukan validasi penuh.

Batas nama indeks

Mulai MongoDB 3.6:

  • Anda tidak dapat menentukan * sebagai nama indeks selama pembuatan indeks.

  • Anda tidak dapat menggunakan kunci indeks untuk menghapus indeks bernama *. Gunakan nama indeks * untuk menghapus indeks tersebut sebagai gantinya.

Sebelum meningkatkan ke MongoDB 3.6, Anda harus:

  • Menghapus indeks: Hapus secara manual semua indeks yang ada bernama *.

  • Mengganti nama indeks: Untuk tetap menyimpan indeks, hapus mereka dan bangun ulang dengan nama baru.

Opsi yang sudah usang

Perubahan pada MongoDB 3.6.1:

  • Menghapus opsi query snapshot.

    • Mesin penyimpanan MMAPv1: Gunakan hint({ _id: 1 }) sebagai gantinya untuk memastikan bahwa dokumen tidak dikembalikan beberapa kali selama query meskipun penulisan perantara menyebabkan dokumen dipindahkan.

    • Mesin penyimpanan lainnya (seperti WiredTiger): Gunakan hint({ $natural: 1 }) sebagai gantinya.

  • Menghapus operator $isolated.

    • Alternatif: Gunakan transaksi atau sesuaikan tingkat read concern untuk mencapai isolasi.

Fitur yang tidak kompatibel dengan versi selanjutnya

Fitur baru berikut di MongoDB 3.6 memerlukan agar featureCompatibilityVersion disetel ke "3.6":

  • UUID untuk koleksi: Setiap koleksi memiliki pengenal unik.

  • Dokumen validasi $jsonSchema: mendukung validasi struktur dokumen dalam format JSON Schema.

  • Change Streams: memantau peristiwa perubahan data secara real-time.

  • Chunk aware secondaries: mengoptimalkan sinkronisasi data pada node sekunder dalam instance kluster sharded.

  • Definisi tampilan, validator dokumen, dan filter indeks parsial: Jika menggunakan fitur query baru di MongoDB 3.6, Anda harus mengaktifkan konfigurasi ini.

  • Sesi dan penulisan yang dapat dicoba ulang: mendukung sesi transaksi dan pengulangan otomatis operasi penulisan.

  • Pembatasan otentikasi untuk pengguna dan peran: mengelola izin pengguna secara lebih rinci.

Nilai default untuk featureCompatibilityVersion adalah:

Anda dapat menggunakan perintah db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } ) untuk melihat nilai featureCompatibilityVersion saat ini.

Untuk menurunkan versi dari MongoDB 3.6, Anda harus membersihkan semua data yang tidak kompatibel, termasuk data persisten terkait sesi, change streams, dan UUID untuk koleksi.