Apa simbol dolar di mongodb?

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   }}
4

Pembaruan 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

Mengapa kita menggunakan simbol dolar di MongoDB?

Sisipkan operasi . Pembaruan yang membuat dokumen baru selama upsert diperlakukan sebagai sisipan daripada pembaruan untuk validasi nama bidang . Upserts dapat menerima bidang awalan dolar ($ ).

Apa itu $or di MongoDB?

MongoDB menyediakan berbagai jenis operator kueri logis dan $or operator adalah salah satunya. Operator ini digunakan untuk melakukan operasi logika ATAU pada larik dua ekspresi atau lebih dan memilih atau mengambil hanya dokumen yang cocok dengan setidaknya satu ekspresi yang diberikan dalam larik.

Apa itu $Add di MongoDB?

Menjumlahkan angka atau menambahkan angka dan tanggal . Jika salah satu argumen adalah tanggal, $add memperlakukan argumen lain sebagai milidetik untuk ditambahkan ke tanggal.

Apa gunanya $Set di MongoDB?

Operator $set mengganti nilai bidang dengan nilai yang ditentukan . Ekspresi operator $set memiliki bentuk berikut. { $set. {