MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

MongoDB $indexOfBytes

Di MongoDB, $indexOfBytes operator pipa agregasi mencari string untuk kemunculan substring dan mengembalikan indeks byte UTF-8 dari kemunculan pertama.

Indeks byte UTF berbasis nol (yaitu dimulai dari 0 ).

Sintaks

Sintaksnya seperti ini:

{ $indexOfBytes: [ <string expression>, <substring expression>, <start>, <end> ] }

Dimana:

  • <string expression> adalah string yang akan dicari.
  • <substring expression> adalah substring yang ingin Anda temukan dalam string.
  • <start> adalah argumen opsional yang menentukan posisi indeks awal untuk pencarian. Dapat berupa ekspresi valid apa pun yang menghasilkan bilangan integral non-negatif.
  • <end> adalah argumen opsional yang menentukan posisi indeks akhir untuk pencarian. Dapat berupa ekspresi valid apa pun yang menghasilkan bilangan integral non-negatif.

Jika nilai yang ditentukan tidak ditemukan, $indexOfBytes mengembalikan -1 .

Jika ada beberapa contoh dari nilai yang ditentukan, hanya yang pertama yang dikembalikan.

Contoh

Misalkan kita memiliki koleksi yang disebut test dengan dokumen sebagai berikut:

{ "_id" : 1, "data" : "c 2021" }
{ "_id" : 2, "data" : "© 2021" }
{ "_id" : 3, "data" : "ไม้เมือง" }

Berikut ini contoh penerapan $indexOfBytes ke dokumen-dokumen itu:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfBytes: [ "$data", "2021" ] }
          }
     }
   ]
)

Hasil:

{ "data" : "c 2021", "result" : 2 }
{ "data" : "© 2021", "result" : 3 }
{ "data" : "ไม้เมือง", "result" : -1 }

Kita dapat melihat bahwa dua dokumen pertama menghasilkan hasil yang berbeda, meskipun substring tampaknya berada pada posisi yang sama untuk setiap dokumen. Pada dokumen pertama, substring ditemukan pada posisi indeks byte 2 , sedangkan dokumen kedua memilikinya di 3 .

Alasannya adalah bahwa simbol hak cipta (© ) di dokumen kedua membutuhkan 2 byte. c karakter (dalam dokumen pertama) hanya menggunakan 1 byte. Karakter spasi juga menggunakan 1 byte.

Hasil dari $indexOfBytes berbasis nol (indeks dimulai dari 0 ), dan akhirnya kita mendapatkan hasil 2 dan 3 masing-masing.

Mengenai dokumen ketiga, substringnya tidak ditemukan sama sekali, sehingga hasilnya adalah -1 .

Berikut ini contoh lain, kecuali kali ini kami mencari karakter Thailand:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfBytes: [ "$data", "เ" ] }
          }
     }
   ]
)

Hasil:

{ "data" : "c 2021", "result" : -1 }
{ "data" : "© 2021", "result" : -1 }
{ "data" : "ไม้เมือง", "result" : 9 }

Dalam hal ini, kami mencari karakter yang muncul di posisi ketiga dalam dokumen ketiga, dan indeks byte UTF-8-nya kembali sebagai 9 .

Ini karena dalam hal ini, setiap karakter menggunakan 3 byte. Tetapi karakter kedua memiliki tanda diakritik, yang juga 3 byte. Oleh karena itu, dua karakter pertama (termasuk diakritik) menggunakan 9 byte. Mengingat pengindeksan berbasis nol, indeks byte UTF-8 mereka berkisar dari 0 ke 8 . Artinya karakter ketiga dimulai pada posisi 9 .

Lihat MongoDB $strLenBytes untuk contoh yang mengembalikan jumlah byte untuk setiap karakter dalam string khusus ini.

Tentukan Posisi Awal

Anda dapat memberikan argumen ketiga untuk menentukan posisi indeks awal untuk pencarian.

Misalkan kita memiliki dokumen berikut:

{ "_id" : 4, "data" : "ABC XYZ ABC" }

Berikut ini contoh penerapan $indexOfBytes dengan posisi awal:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 4 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfBytes: [ "$data", "ABC", 1 ] }
          }
     }
   ]
)

Hasil:

{ "data" : "ABC XYZ ABC", "result" : 8 }

Dalam hal ini, instance kedua dari substring dikembalikan. Ini karena kami memulai pencarian di posisi 1 , dan turunan pertama dari substring dimulai pada posisi 0 (sebelum posisi awal pencarian).

Jika posisi awal adalah angka yang lebih besar dari panjang byte string atau lebih besar dari posisi akhir, $indexOfBytes mengembalikan -1 .

Jika angkanya negatif, $indexOfBytes mengembalikan kesalahan.

Tentukan Posisi Akhir

Anda juga dapat memberikan argumen keempat untuk menentukan posisi indeks akhir untuk pencarian.

Jika Anda memberikan argumen ini, Anda juga perlu memberikan posisi awal. Gagal melakukannya akan mengakibatkan argumen ini ditafsirkan sebagai titik awal.

Contoh:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 4 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfBytes: [ "$data", "XYZ", 0, 5 ] }
          }
     }
   ]
)

Hasil:

{ "data" : "ABC XYZ ABC", "result" : -1 }

Hasilnya adalah -1 yang berarti substring tidak ditemukan. Itu karena kami memulai pencarian kami di posisi 0 dan berakhir di posisi 5 , oleh karena itu tidak menangkap substring.

Inilah yang terjadi jika kita menaikkan posisi indeks akhir:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 4 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfBytes: [ "$data", "XYZ", 0, 7 ] }
          }
     }
   ]
)

Hasil:

{ "data" : "ABC XYZ ABC", "result" : 4 }

Kali ini nilainya dimasukkan dan posisi indeksnya dikembalikan.

Jika posisi akhir lebih kecil dari posisi awal, $indexOfBytes mengembalikan -1 .

Jika angkanya negatif, $indexOfBytes mengembalikan kesalahan.

Bidang Tidak Ada

Jika bidang tidak ada dalam dokumen, $indexOfBytes mengembalikan null .

Misalkan kita memiliki dokumen berikut:

{ "_id" : 5 }

Inilah yang terjadi ketika kita menerapkan $indexOfBytes :

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 5 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfBytes: [ "$data", "XYZ" ] }
          }
     }
   ]
)

Hasil:

{ "result" : null }

Nilai Null

Jika argumen pertama adalah null , $indexOfBytes mengembalikan null .

Misalkan kita memiliki dokumen berikut:

{ "_id" : 6, "data" : null }

Inilah yang terjadi ketika kita menerapkan $indexOfBytes :

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 6 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfBytes: [ "$data", "XYZ" ] }
          }
     }
   ]
)

Hasil:

{ "data" : null, "result" : null }

Namun, ketika argumen kedua (yaitu substring) adalah null , kesalahan dikembalikan:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 1 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfBytes: [ "$data", null ] }
          }
     }
   ]
)

Hasil:

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$indexOfBytes requires a string as the second argument, found: null",
	"code" : 40092,
	"codeName" : "Location40092"
} : aggregate failed :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/assert.js:18:14
[email protected]/mongo/shell/assert.js:639:17
[email protected]/mongo/shell/assert.js:729:16
[email protected]/mongo/shell/db.js:266:5
[email protected]/mongo/shell/collection.js:1058:12
@(shell):1:1

Jenis Data Salah

Jika argumen pertama adalah tipe data yang salah (yaitu tidak diselesaikan menjadi string), $indexOfBytes mengembalikan kesalahan.

Misalkan kita memiliki dokumen berikut:

{ "_id" : 7, "data" : 123 }

Inilah yang terjadi ketika kita menerapkan $indexOfBytes ke dokumen itu:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 7 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfBytes: [ "$data", "XYZ" ] }
          }
     }
   ]
)

Hasil:

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$indexOfBytes requires a string as the first argument, found: double",
	"code" : 40091,
	"codeName" : "Location40091"
} : aggregate failed :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/assert.js:18:14
[email protected]/mongo/shell/assert.js:639:17
[email protected]/mongo/shell/assert.js:729:16
[email protected]/mongo/shell/db.js:266:5
[email protected]/mongo/shell/collection.js:1058:12
@(shell):1:1

Seperti yang dinyatakan oleh pesan kesalahan, $indexOfBytes requires a string as the first argument .


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Solusi MongoDB untuk dokumen di atas ukuran 16mb?

  2. Buat publikasi reaktif dengan bidang tambahan di setiap dokumen

  3. Pertempuran Database NoSQL - Membandingkan MongoDB &Cassandra

  4. Menginstal dan Menjalankan MongoDB di OSX

  5. Hitungan Mongodb berbeda dengan beberapa bidang grup