Selamat datang di postingan kedua dalam seri "MongoDB Animated 🍩" saya, di mana saya memberikan contoh animasi dan penjelasan untuk operasi MongoDB yang tidak ingin saya googling lagi
Dalam posting ini, kami akan meninjau berbagai strategi untuk memperbarui elemen dari array tersemat
Saya akan menggunakan koleksi contoh yang sama yang digunakan di artikel sebelumnya di seri ini. Ini terdiri dari kumpulan sederhana "donut combos" dari toko donat. Setiap kombo memiliki nama dan rangkaian donat yang akan disertakan jika pelanggan memilih kombo tersebut. Berikut skema lengkapnya
// donutCombo Schema
{
name: { type: String, required: true },
active: { type: Boolean, required: true },
donuts: [{
color: { type: String },
glazing: { type: Boolean }
}]
}
Masuk ke mode layar penuh Keluar dari mode layar penuh
Memperbarui elemenMemperbarui semua elemen dengan $[]
Menggunakan operator $set
_ digabungkan dengan operator semua posisi
db.donutCombos.updateMany[{ active: true }, {
$set: {
'donuts.$[].glazing': false
}
}];
0 memungkinkan kita memperbarui semua elemen arraySebagai contoh, katakanlah kita ingin menghapus kaca dari semua donat di semua dokumen aktif
db.donutCombos.updateMany[{ active: true }, {
$set: {
'donuts.$[].glazing': false
}
}];
_Masuk ke mode layar penuh Keluar dari mode layar penuh
Operasi semacam ini bisa berguna saat Anda bermigrasi ke skema baru dan dokumen Anda memiliki larik tersemat. Misalnya, jika Anda perlu menambahkan properti baru dengan nilai default ke semua elemen array
Cara lain untuk menghapus kaca bisa dengan menghapus properti
db.donutCombos.updateMany[{ active: true }, {
$set: {
'donuts.$[].glazing': false
}
}];
1 dari semua donat di semua dokumen aktifIni dapat dilakukan dengan menggunakan operator
db.donutCombos.updateMany[{ active: true }, {
$set: {
'donuts.$[].glazing': false
}
}];
_2 yang dikombinasikan dengan semua operator posisi db.donutCombos.updateMany[{ active: true }, {
$set: {
'donuts.$[].glazing': false
}
}];
0db.donutCombos.updateMany[{ active: true }, {
$unset: {
'donuts.$[].glazing': 1
}
}];
_Masuk ke mode layar penuh Keluar dari mode layar penuh
Perhatikan bahwa, di dalam objek
_2, kita harus menentukan kunci [properti yang ingin kita hapus] dan nilainya, yang tidak memengaruhi operasi. Dalam hal ini, kami menggunakan "1", tetapi Anda juga dapat menggunakan string kosong, misalnya.db.donutCombos.updateMany[{ active: true }, { $set: { 'donuts.$[].glazing': false } }];
_5db.donutCombos.updateMany[{ active: true }, { $set: { 'donuts.$[].glazing': false } }];
Memperbarui elemen pertama dengan $
Anda mungkin hanya perlu memperbarui elemen pertama dari array Anda. Dalam hal ini, Anda harus menggunakan operator posisi
db.donutCombos.updateMany[{ active: true }, {
$set: {
'donuts.$[].glazing': false
}
}];
6. Operator posisi ini akan memungkinkan kita menerapkan perubahan pada elemen pertama yang cocok dengan db.donutCombos.updateMany[{ active: true }, {
$set: {
'donuts.$[].glazing': false
}
}];
7 [parameter pertama dari metode db.donutCombos.updateMany[{ active: true }, {
$set: {
'donuts.$[].glazing': false
}
}];
8]. Bidang array harus menjadi bagian dari db.donutCombos.updateMany[{ active: true }, {
$set: {
'donuts.$[].glazing': false
}
}];
7Dengan menggabungkan operator posisi
db.donutCombos.updateMany[{ active: true }, {
$set: {
'donuts.$[].glazing': false
}
}];
_6 dengan $set
, kita dapat memperbarui properti dari elemen larik pertama yang cocok dengan db.donutCombos.updateMany[{ active: true }, {
$set: {
'donuts.$[].glazing': false
}
}];
7 kitaPada contoh berikut kita akan memperbarui donat putih pertama di setiap dokumen dan mengubah warnanya menjadi "merah muda"
db.donutCombos.updateMany[{ 'donuts.color': 'white' }, {
$set: {
'donuts.$.color': 'pink'
}
}];
Masuk ke mode layar penuh Keluar dari mode layar penuh
Operator posisi
db.donutCombos.updateMany[{ active: true }, {
$set: {
'donuts.$[].glazing': false
}
}];
6 juga dapat digabungkan dengan db.donutCombos.updateMany[{ active: true }, {
$set: {
'donuts.$[].glazing': false
}
}];
2 untuk menghapus properti dari elemen larik pertama yang cocok dengan db.donutCombos.updateMany[{ active: true }, {
$set: {
'donuts.$[].glazing': false
}
}];
7 kitaJadi untuk mencobanya, mari hilangkan warna dari donat putih pertama yang ditemukan di setiap dokumen
db.donutCombos.updateMany[{ 'donuts.color': 'white' }, {
$unset: {
'donuts.$.color': 1
}
}];
Masuk ke mode layar penuh Keluar dari mode layar penuh
Updating elements that match a filter with $[]
Untuk memperbarui sekumpulan elemen yang cocok dengan filter tertentu, kita harus menggunakan operator posisi terfilter
db.donutCombos.updateMany[{ active: true }, {
$unset: {
'donuts.$[].glazing': 1
}
}];
6 di mana db.donutCombos.updateMany[{ active: true }, {
$unset: {
'donuts.$[].glazing': 1
}
}];
7 adalah placeholder untuk nilai yang mewakili satu elemen arrayKita kemudian harus menggunakan parameter ketiga [opsi] dari metode
db.donutCombos.updateMany[{ active: true }, {
$unset: {
'donuts.$[].glazing': 1
}
}];
8 untuk menentukan satu set db.donutCombos.updateMany[{ active: true }, {
$unset: {
'donuts.$[].glazing': 1
}
}];
9. Di sini kita akan menentukan kondisi yang harus dipenuhi oleh setiap elemen array yang ingin kita perbarui untuk diperbaruiPada contoh selanjutnya, kita akan mengubah setiap warna putih donat menjadi hijau, hanya pada dokumen yang aktif
db.donutCombos.updateMany[{ active: true }, {
$set: {
"donuts.$[donut].color": "green"
}
},
{
arrayFilters: [{ "donut.color": "white" }]
}];
Masuk ke mode layar penuh Keluar dari mode layar penuh
Menggabungkan operator posisi yang difilter
db.donutCombos.updateMany[{ active: true }, {
$unset: {
'donuts.$[].glazing': 1
}
}];
6 [atau dalam contoh kita db.donutCombos.updateMany[{ 'donuts.color': 'white' }, {
$set: {
'donuts.$.color': 'pink'
}
}];
1] dengan operator db.donutCombos.updateMany[{ active: true }, {
$set: {
'donuts.$[].glazing': false
}
}];
2, kita dapat menghapus properti dari semua elemen dalam array yang cocok dengan kriteria db.donutCombos.updateMany[{ 'donuts.color': 'white' }, {
$set: {
'donuts.$.color': 'pink'
}
}];
3 kitaMisalnya, kami dapat menghapus warna setiap donat putih di setiap dokumen aktif
db.donutCombos.updateMany[{ active: true }, {
$unset: {
"donuts.$[donut].color": 1
}
},
{
arrayFilters: [{ "donut.color": "white" }]
}];
Masuk ke mode layar penuh Keluar dari mode layar penuh
Cobalah sendiriSaya membuat repo untuk mencoba kueri MongoDB di memori menggunakan Node. js dengan driver Jest dan MongoDB Node. Saya menggunakan tes untuk menjalankan kueri dan memverifikasi bahwa semuanya telah diperbarui dengan benar. Saya juga menyertakan logger yang mencetak dokumen yang diperbarui di konsol yang menampilkan perubahan yang diterapkan menggunakan sintaks sorot diff
Anda dapat menemukan contoh yang saya sertakan dalam artikel ini di folder
db.donutCombos.updateMany[{ 'donuts.color': 'white' }, {
$set: {
'donuts.$.color': 'pink'
}
}];
4pawap90 / try-mongodb-queries
Contoh proyek sederhana untuk mencoba kueri MongoDB di memori menggunakan Jest
Sebuah proyek sederhana untuk mencoba kueri MongoDB di memori menggunakan Jest. Termasuk logger yang mencatat perbedaan antara data pengujian asli dan data setelah pembaruan menggunakan penyorotan sintaks diff Apa yang Anda butuhkan untuk menjalankan proyek ini [MongoDB tidak diperlukan karena akan berjalan di memori, ditangani oleh paket
5]db.donutCombos.updateMany[{ 'donuts.color': 'white' }, {
$set: {
'donuts.$.color': 'pink'
}
}];
1. Instal dependensi
npm install
2. Jalankan tes
npm test
PeralatanAlat utama yang digunakan dalam proyek ini
- Pengandar Node MongoDB
- Bersenda gurau
- paket mongodb-memory-server oleh @nodkz
Lihat di GitHub
Sumber dayaUntuk info lebih lanjut tentang memperbarui array, berikut adalah beberapa sumber dari dokumen resmi MongoDB
Operator Pembaruan Array [dokumen. mongodb. com]
Perbarui Array dalam Dokumen [docs. mongodb. com]
Saya tertarik dengan tanggapan Anda. Apakah postingan ini bermanfaat?