Perhatikan juga bahwa ini adalah kueri yang sangat tidak efisien secara umum karena perlu menelusuri semua dokumen dalam koleksi untuk menemukan kecocokan. Anda mungkin ingin mempertimbangkan untuk menyimpan simbol ticker saham dalam properti array yang berbeda sebagai bagian dari dokumen dan menggunakan $in untuk menemukannya (Anda kemudian dapat menggunakan indeks misalnya dan akan sangat cepat untuk menemukan string yang cocok)
Operator $literal_ dapat berguna ketika Anda memiliki nilai yang dapat secara tidak sengaja ditafsirkan oleh MongoDB sebagai ekspresi, tetapi Anda tidak menginginkannya
Misalnya, jika Anda memiliki jumlah uang yang menyertakan tanda dolar, MongoDB mungkin secara tidak sengaja menafsirkannya sebagai nama bidang. Anda dapat menggunakan $literal untuk mencegah MongoDB menafsirkan ekspresi tersebut
Contoh
Misalkan kita memiliki koleksi bernama test dengan dokumen berikut
{ "_id" : 1, "name" : "Homer" }Berikut adalah contoh penerapan $literal
db.test.aggregate( [ { $match: { _id: { $in: [ 1 ] } } }, { $project: { _id: 0, interpreted: "$name", literal: { $literal: "$name" } } } ] )_Hasil
{ "interpreted" : "Homer", "literal" : "$name" }Dalam contoh ini, kami mengembalikan nilai bidang db.test.aggregate( [ { $match: { _id: { $in: [ 1 ] } } }, { $project: { _id: 0, interpreted: "$name", literal: { $literal: "$name" } } } ] )_1 dengan menggunakan db.test.aggregate( [ { $match: { _id: { $in: [ 1 ] } } }, { $project: { _id: 0, interpreted: "$name", literal: { $literal: "$name" } } } ] )2 untuk merujuknya
Kami juga mengembalikan nilai literal db.test.aggregate( [ { $match: { _id: { $in: [ 1 ] } } }, { $project: { _id: 0, interpreted: "$name", literal: { $literal: "$name" } } } ] )_2, tanpa MongoDB mengartikannya sebagai bidang db.test.aggregate( [ { $match: { _id: { $in: [ 1 ] } } }, { $project: { _id: 0, interpreted: "$name", literal: { $literal: "$name" } } } ] )1
Contoh 2
Misalkan koleksi kita berisi dokumen berikut
{ "_id" : 2, "a" : 10, "b" : 5 }Berikut contoh lain penggunaan $literal
db.test.aggregate( [ { $match: { _id: { $in: [ 2 ] } } }, { $project: { _id: 0, interpreted: { $multiply: [ "$a", "$b" ] }, literal: { $literal: { $multiply: [ "$a", "$b" ] } } } } ] )_Hasil
{ "interpreted" : 50, "literal" : { "$multiply" : [ "$a", "$b" ] } }_Dalam hal ini, bidang pertama yang dikembalikan berisi hasil dari operator db.test.aggregate( [ { $match: { _id: { $in: [ 1 ] } } }, { $project: { _id: 0, interpreted: "$name", literal: { $literal: "$name" } } } ] )6 terhadap bidang db.test.aggregate( [ { $match: { _id: { $in: [ 1 ] } } }, { $project: { _id: 0, interpreted: "$name", literal: { $literal: "$name" } } } ] )7 dan db.test.aggregate( [ { $match: { _id: { $in: [ 1 ] } } }, { $project: { _id: 0, interpreted: "$name", literal: { $literal: "$name" } } } ] )8
MongoDB 5. 0 menambahkan dukungan yang ditingkatkan untuk nama bidang yang diawali dengan dolar (db.books.insertOne( { "$id": "h1961-01", "location": { "$db": "novels", "$ref": "2007042768", "$inc": true} } )1) atau yang mengandung titik (db.books.insertOne( { "$id": "h1961-01", "location": { "$db": "novels", "$ref": "2007042768", "$inc": true} } )0). Aturan validasi untuk menyimpan data telah diperbarui agar lebih mudah bekerja dengan sumber data yang menggunakan karakter ini
Dalam banyak kasus, data yang disimpan menggunakan nama bidang seperti ini tidak dapat diakses secara langsung. Anda perlu menggunakan metode pembantu seperti , , dan dalam kueri yang mengakses bidang tersebut
Aturan validasi nama bidang tidak sama untuk semua jenis operasi penyimpanan. Halaman ini merangkum bagaimana berbagai operasi penyisipan dan pembaruan menangani dolar (db.books.insertOne( { "$id": "h1961-01", "location": { "$db": "novels", "$ref": "2007042768", "$inc": true} } )1) nama bidang yang diawali
Sisipkan operasi
Kolom awalan Dollar (db.books.insertOne( { "$id": "h1961-01", "location": { "$db": "novels", "$ref": "2007042768", "$inc": true} } )_1) diizinkan sebagai nama kolom tingkat atas dan bertingkat untuk sisipan
db.sales.insertOne( { "$price": 50.00, "quantity": 30} )
Bidang awalan dolar (db.books.insertOne( { "$id": "h1961-01", "location": { "$db": "novels", "$ref": "2007042768", "$inc": true} } )_1) diizinkan pada sisipan menggunakan kata-kata yang dicadangkan. Nama operator seperti dapat digunakan sebagai nama bidang serta kata-kata seperti db.expenses.updateOne( { "date": "2021-07-07" }, { $set: { "phone": 25.17, "$hotel": 320.10 } }, { upsert: true })1, db.expenses.updateOne( { "date": "2021-07-07" }, { $set: { "phone": 25.17, "$hotel": 320.10 } }, { upsert: true })2, dan db.expenses.updateOne( { "date": "2021-07-07" }, { $set: { "phone": 25.17, "$hotel": 320.10 } }, { upsert: true })3
db.books.insertOne( { "$id": "h1961-01", "location": { "$db": "novels", "$ref": "2007042768", "$inc": true} } )
Pembaruan yang membuat dokumen baru selama proses diperlakukan sebagai db.expenses.updateOne( { "date": "2021-07-07" }, { $set: { "phone": 25.17, "$hotel": 320.10 } }, { upsert: true })4 daripada db.expenses.updateOne( { "date": "2021-07-07" }, { $set: { "phone": 25.17, "$hotel": 320.10 } }, { upsert: true })5 untuk validasi nama bidang. dapat menerima kolom awalan dolar (db.books.insertOne( { "$id": "h1961-01", "location": { "$db": "novels", "$ref": "2007042768", "$inc": true} } )_1). Namun, apakah kasus khusus dan operasi pemutakhiran serupa dapat menyebabkan kesalahan jika bagian db.expenses.updateOne( { "date": "2021-07-07" }, { $set: { "phone": 25.17, "$hotel": 320.10 } }, { upsert: true })7 pemutakhiran memilih dokumen yang ada
Contoh kode ini memiliki db.expenses.updateOne( { "date": "2021-07-07" }, { $set: { "phone": 25.17, "$hotel": 320.10 } }, { upsert: true })_8 sehingga akan menyisipkan dokumen baru jika koleksi belum berisi dokumen yang cocok dengan istilah kueri, db.expenses.updateOne( { "date": "2021-07-07" }, { $set: { "phone": 25.17, "$hotel": 320.10 } }, { upsert: true })9. Jika kode contoh ini cocok dengan dokumen yang ada, pembaruan akan gagal karena { "_id": "E123", "address": { "$number": 123, "$street": "Elm Road" }, "$rooms": { "br": 2, "bath": 1 }}0 diawali dengan dolar (db.books.insertOne( { "$id": "h1961-01", "location": { "$db": "novels", "$ref": "2007042768", "$inc": true} } )1)
db.expenses.updateOne( { "date": "2021-07-07" }, { $set: { "phone": 25.17, "$hotel": 320.10 } }, { upsert: true })
Dokumen Mengganti Pembaruan
Perbarui operator dengan mengganti bidang yang ada dengan dokumen baru atau memodifikasi bidang tersebut. Jika pembaruan melakukan penggantian, bidang awalan dolar (db.books.insertOne( { "$id": "h1961-01", "location": { "$db": "novels", "$ref": "2007042768", "$inc": true} } )1) tidak diizinkan sebagai nama bidang tingkat atas
Pertimbangkan dokumen seperti
{ "_id": "E123", "address": { "$number": 123, "$street": "Elm Road" }, "$rooms": { "br": 2, "bath": 1 }}
Anda dapat menggunakan operator pembaruan yang menggantikan dokumen yang ada untuk mengubah bidang { "_id": "E123", "address": { "$number": 123, "$street": "Elm Road" }, "$rooms": { "br": 2, "bath": 1 }}3 tetapi Anda tidak dapat memperbarui bidang { "_id": "E123", "address": { "$number": 123, "$street": "Elm Road" }, "$rooms": { "br": 2, "bath": 1 }}4 dengan cara itu
db.housing.updateOne( { "_id": "E123" }, { $set: { "address.$street": "Elm Ave" } })
Gunakan sebagai bagian dari pipa agregasi untuk
dolar (db.books.insertOne( { "$id": "h1961-01", "location": { "$db": "novels", "$ref": "2007042768", "$inc": true} } )_1) bidang diawali seperti { "_id": "E123", "address": { "$number": 123, "$street": "Elm Road" }, "$rooms": { "br": 2, "bath": 1 }}4Pembaruan Modifikasi Dokumen
Saat pembaruan mengubah, bukannya mengganti, bidang dokumen yang ada, bidang awalan dolar (db.books.insertOne( { "$id": "h1961-01", "location": { "$db": "novels", "$ref": "2007042768", "$inc": true} } )1) dapat menjadi nama bidang tingkat teratas. Subbidang dapat diakses secara langsung, tetapi Anda memerlukan metode pembantu untuk mengakses bidang tingkat atas
Tip
Lihat juga
, , ,
Pertimbangkan koleksi dengan dokumen seperti catatan inventaris ini
{ _id: ObjectId("610023ad7d58ecda39b8d161"), "part": "AB305", "$bin": 200, "quantity": 100, "pricing": { sale: true, "$discount": 60 }}
Subbidang db.housing.updateOne( { "_id": "E123" }, { $set: { "address.$street": "Elm Ave" } })_3 dapat ditanyakan secara langsung
db.inventory.findAndModify( { query: { "part": { $eq: "AB305" } }, update: { $inc: { "pricing.$discount": 10 } }} )
Gunakan dan untuk mengakses nilai bidang db.housing.updateOne( { "_id": "E123" }, { $set: { "address.$street": "Elm Ave" } })6 tingkat atas
db.inventory.findAndModify( { query: { $expr: { $eq: [ { $getField: { $literal: "$bin" } }, 200 ] } }, update: { $inc: { "quantity": 10 } }} )
Pembaruan Menggunakan Pipa Agregasi
Gunakan , , dan dalam tahap untuk memodifikasi dolar (db.books.insertOne( { "$id": "h1961-01", "location": { "$db": "novels", "$ref": "2007042768", "$inc": true} } )1) bidang awalan dalam agregasi
Pertimbangkan koleksi catatan sekolah seperti
{ "_id": 100001, "$term": "fall", "registered": true, "grade": 4}
Buat koleksi baru untuk semester musim semi menggunakan bidang untuk memperbarui dolar (db.books.insertOne( { "$id": "h1961-01", "location": { "$db": "novels", "$ref": "2007042768", "$inc": true} } )1) diawali { _id: ObjectId("610023ad7d58ecda39b8d161"), "part": "AB305", "$bin": 200, "quantity": 100, "pricing": { sale: true, "$discount": 60 }}3
db.school.aggregate( [ { $match: { "registered": true } }, { $replaceWith: { $setField: { field: { $literal: "$term" }, input: "$$ROOT", value: "spring" } } }, { $out: "spring2022" }] )
Batasan Umum
Selain aturan validasi penyimpanan di atas, ada beberapa batasan umum dalam penggunaan nama bidang yang diawali dengan dolar (db.books.insertOne( { "$id": "h1961-01", "location": { "$db": "novels", "$ref": "2007042768", "$inc": true} } )1). Bidang ini tidak bisa
Diindeks
Digunakan sebagai bagian dari kunci beling
Divalidasi menggunakan
Dimodifikasi dengan escape sequence
Digunakan dengan Enkripsi Tingkat Bidang
Digunakan sebagai subbidang dalam dokumen { _id: ObjectId("610023ad7d58ecda39b8d161"), "part": "AB305", "$bin": 200, "quantity": 100, "pricing": { sale: true, "$discount": 60 }}6
Peringatan
Kemungkinan Kehilangan Data Dengan Tanda Dolar ($) dan Periode (. )
Ada kemungkinan kecil kehilangan data saat menggunakan dolar (db.books.insertOne( { "$id": "h1961-01", "location": { "$db": "novels", "$ref": "2007042768", "$inc": true} } )1) dengan awalan nama bidang atau nama bidang yang mengandung titik (db.books.insertOne( { "$id": "h1961-01", "location": { "$db": "novels", "$ref": "2007042768", "$inc": true} } )0) jika nama bidang ini digunakan bersama dengan penulisan yang tidak diakui (tulis masalah { _id: ObjectId("610023ad7d58ecda39b8d161"), "part": "AB305", "$bin": 200, "quantity": 100, "pricing": { sale: true, "$discount": 60 }}9) di server yang lebih lama dari MongoDB 5. 0
Saat menjalankan perintah insert, update, dan findAndModify, driver yang ada 5. 0 kompatibel hapus pembatasan penggunaan dokumen dengan nama bidang yang diawali dolar (db.books.insertOne( { "$id": "h1961-01", "location": { "$db": "novels", "$ref": "2007042768", "$inc": true} } )1) atau yang mengandung titik (db.books.insertOne( { "$id": "h1961-01", "location": { "$db": "novels", "$ref": "2007042768", "$inc": true} } )0). Nama bidang ini menghasilkan kesalahan sisi klien di versi driver sebelumnya
Pembatasan dihapus terlepas dari versi server yang terhubung dengan driver. Jika 5. 0 driver mengirim dokumen ke server lama, dokumen akan ditolak tanpa mengirim kesalahan
Peringatan
Kekhawatiran Impor dan Ekspor Dengan Tanda Dolar ($) dan Periode (. )
Mulai di MongoDB 5. 0, nama bidang dokumen dapat berupa dolar (db.books.insertOne( { "$id": "h1961-01", "location": { "$db": "novels", "$ref": "2007042768", "$inc": true} } )1) diawali dan dapat berisi titik (db.books.insertOne( { "$id": "h1961-01", "location": { "$db": "novels", "$ref": "2007042768", "$inc": true} } )0). Namun, dan mungkin tidak berfungsi seperti yang diharapkan dalam beberapa situasi dengan nama bidang yang menggunakan karakter ini
tidak dapat membedakan antara pembungkus tipe dan bidang yang kebetulan memiliki nama yang sama dengan pembungkus tipe. Jangan gunakan format JSON yang diperluas dalam konteks di mana representasi BSON terkait mungkin menyertakan kunci awalan dolar (db.books.insertOne( { "$id": "h1961-01", "location": { "$db": "novels", "$ref": "2007042768", "$inc": true} } )1). Mekanismenya merupakan pengecualian dari aturan umum ini
Ada juga larangan menggunakan dan dengan titik (db.books.insertOne( { "$id": "h1961-01", "location": { "$db": "novels", "$ref": "2007042768", "$inc": true} } )0) pada nama kolom. Karena file CSV menggunakan titik (db.books.insertOne( { "$id": "h1961-01", "location": { "$db": "novels", "$ref": "2007042768", "$inc": true} } )0) untuk mewakili hierarki data, titik (db.books.insertOne( { "$id": "h1961-01", "location": { "$db": "novels", "$ref": "2007042768", "$inc": true} } )0) dalam nama bidang akan disalahartikan sebagai tingkat penumpukan