TL;DR:$inc menjamin pembaruan di tempat, $set tidak, tetapi dalam keadaan yang sangat spesifik, ini juga dapat dilakukan di tempat.
Detail
Ada dua aspek dalam hal ini:
-
bagaimana cara melewati kabel?
Informasi dikirim sebagai operasi,
$settetap menjadi$setjadi delta. Itu juga berlaku untuk oplog yang digunakan untuk replikasi. Dengan cara ini, menggunakan$setlebih efisien dalam hal bandwidth. -
bagaimana pembaruan di disk?
MongoDB melakukan pembaruan di tempat jika dan hanya jika kunci (bidang) sudah ada , jadi saat Anda menambahkan bidang baru ke dokumen, itu adalah operasi yang lebih besar daripada sekadar menetapkan nilai yang berbeda ke bidang yang sudah ada.
Namun, meskipun demikian, nilainya harus memiliki ukuran yang sama dan harus tidak mengubah jenis dan mereka harus bertipe
double, long, int or bool, jika tidak maka tidak pembaruan di tempat saat ini.
Saya tidak yakin bagaimana yang terakhir ini benar-benar penting dalam praktik , tetapi server pasti menggunakan jalur kode yang sama sekali berbeda untuk keduanya, sehingga misalnya dapat menyebabkan pemesanan ulang bidang. Untuk dokumen yang sangat besar, hal itu mungkin akan menghasilkan perbedaan kinerja yang terukur.
Ini menunjukkan bahwa $inc sangat berbeda karena hanya mengizinkan operasi yang pasti ada, karena $inc hanya beroperasi pada tipe numerik dan tidak dapat mengubah ukuran atau tipe, secara alami.