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

MongoDB $indexOfCP

Di MongoDB, $indexOfCP operator pipa agregasi mencari string untuk kemunculan substring dan mengembalikan indeks titik kode UTF dari kemunculan pertama.

Indeks titik kode UTF berbasis nol (yaitu dimulai dari 0 ).

Sintaks

Sintaksnya seperti ini:

{ $indexOfCP: [ <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, $indexOfCP 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 $indexOfCP ke dokumen-dokumen itu:

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

Hasil:

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

Dalam dua dokumen pertama, substring ditemukan pada posisi indeks titik kode UTF 2 . Diberikan $indexOfCP hasilnya berbasis nol (indeks dimulai dari 0 ) posisi 2 mewakili titik kode ketiga.

Ini adalah hasil yang berbeda dengan apa yang kita dapatkan jika kita menggunakan $indexOfBytes , karena simbol hak cipta (© ) di dokumen kedua membutuhkan 2 byte. Tapi itu hanya menggunakan satu titik kode, yang sama dengan huruf c menggunakan.

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: { $indexOfCP: [ "$data", "เ" ] }
          }
     }
   ]
)

Hasil:

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

Dalam hal ini, kami mencari karakter yang ada di dokumen ketiga, dan indeks titik kode UTF-8-nya kembali sebagai 3 . Diberikan $indexOfCP hasilnya berbasis nol, ini berarti poin kode keempat.

Ini karena karakter kedua memiliki tanda diakritik, yang juga merupakan titik kode. Oleh karena itu, karakter pertama adalah satu titik kode dan karakter kedua adalah dua titik kode (termasuk diakritik), yang sama dengan tiga. Artinya karakter kita dimulai dari posisi keempat (yaitu kode poin angka 3 , karena penghitungan indeks dimulai dari 0 ).

Lihat MongoDB $strLenCP untuk contoh yang mengembalikan jumlah poin kode untuk setiap karakter dalam string khusus ini. Dan lihat MongoDB $strLenBytes untuk melihat jumlah byte dalam string yang sama.

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 $indexOfCP dengan posisi awal:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 4 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfCP: [ "$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 string atau lebih besar dari posisi akhir, $indexOfCP mengembalikan -1 .

Jika angkanya negatif, $indexOfCP 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: { $indexOfCP: [ "$data", "XYZ", 0, 3 ] }
          }
     }
   ]
)

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 3 , 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: { $indexOfCP: [ "$data", "XYZ", 0, 5 ] }
          }
     }
   ]
)

Hasil:

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

Kali ini nilainya dimasukkan dan posisi indeksnya dikembalikan.

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

Jika angkanya negatif, $indexOfCP mengembalikan kesalahan.

Bidang Tidak Ada

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

Misalkan kita memiliki dokumen berikut:

{ "_id" : 5 }

Inilah yang terjadi ketika kita menerapkan $indexOfCP :

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

Hasil:

{ "result" : null }

Nilai Null

Jika argumen pertama adalah null , $indexOfCP mengembalikan null .

Misalkan kita memiliki dokumen berikut:

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

Inilah yang terjadi ketika kita menerapkan $indexOfCP :

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 6 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfCP: [ "$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: { $indexOfCP: [ "$data", null ] }
          }
     }
   ]
)

Hasil:

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$indexOfCP requires a string as the second argument, found: null",
	"code" : 40094,
	"codeName" : "Location40094"
} : 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), $indexOfCP mengembalikan kesalahan.

Misalkan kita memiliki dokumen berikut:

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

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

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

Hasil:

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$indexOfCP requires a string as the first argument, found: double",
	"code" : 40093,
	"codeName" : "Location40093"
} : 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, $indexOfCP requires a string as the first argument .


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Dapatkan ID Dokumen yang Terakhir Dimasukkan di MongoDB Dengan Driver Java

  2. Cluster MongoDB Kinerja Tinggi di Amazon EC2

  3. MongoDB findOneAndUpdate()

  4. Bagaimana Memodelkan sistem pemungutan suara suka dengan MongoDB

  5. Bagaimana meningkatkan kinerja sisipan MongoDB