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,
$set
tetap menjadi$set
jadi delta. Itu juga berlaku untuk oplog yang digunakan untuk replikasi. Dengan cara ini, menggunakan$set
lebih 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.