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

MongoDB $indexOfArray

Di MongoDB, $indexOfArray operator pipa agregasi mencari larik untuk kemunculan nilai tertentu dan mengembalikan indeks larik dari kemunculan pertama.

Sintaks

Sintaksnya seperti ini:

{ $indexOfArray: [ <array expression>, <search expression>, <start>, <end> ] }

Dimana:

  • <array expression> adalah larik yang akan dicari.
  • <search expression> adalah nilai yang ingin Anda temukan dalam larik.
  • <start> adalah argumen opsional yang menentukan titik awal yang akan dicari dalam array. 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.

Di MongoDB, array berbasis nol, jadi penghitungan indeks dimulai dari nol (0 ).

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

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

Contoh

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

{ "_id" : 1, "prod" : "Bat", "sizes" : [ "XS", "M", "L" ] }
{ "_id" : 2, "prod" : "Hat", "sizes" : [ "XS", "S", "L", "XL" ] }
{ "_id" : 3, "prod" : "Cap", "sizes" : [ "XXS", "XS", "M", "XL" ] }
{ "_id" : 4, "prod" : "Zap", "sizes" : [ 10, 12, 15 ] }
{ "_id" : 5, "prod" : "Tap", "sizes" : [ 15, 16, 20 ] }

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

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", "XS" ] }
          }
     }
   ]
)

Hasil:

{ "sizes" : [ "XS", "M", "L" ], "result" : 0 }
{ "sizes" : [ "XS", "S", "L", "XL" ], "result" : 0 }
{ "sizes" : [ "XXS", "XS", "M", "XL" ], "result" : 1 }
{ "sizes" : [ 10, 12, 15 ], "result" : -1 }
{ "sizes" : [ 15, 16, 20 ], "result" : -1 }

Dalam dua dokumen pertama, nilai pencarian ditemukan pada posisi 0 (array berbasis nol).

Pada dokumen ketiga, ditemukan pada posisi 1 . Perhatikan bahwa pencarian itu untuk kecocokan yang sama persis. Itu tidak mengembalikan posisi 0 , meskipun nilai pada posisi 0 berisi nilai pencarian (yaitu XXS berisi XS ).

Nilai pencarian tidak ditemukan dalam dua dokumen terakhir, jadi -1 dikembalikan.

Berikut contoh lain, kecuali kali ini kita mencari nilai numerik:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", 15 ] }
          }
     }
   ]
)

Hasil:

{ "sizes" : [ "XS", "M", "L" ], "result" : -1 }
{ "sizes" : [ "XS", "S", "L", "XL" ], "result" : -1 }
{ "sizes" : [ "XXS", "XS", "M", "XL" ], "result" : -1 }
{ "sizes" : [ 10, 12, 15 ], "result" : 2 }
{ "sizes" : [ 15, 16, 20 ], "result" : 0 }

Tentukan Posisi Awal

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

Contoh:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 4, 5 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", 15, 1 ] }
          }
     }
   ]
)

Hasil:

{ "sizes" : [ 10, 12, 15 ], "result" : 2 }
{ "sizes" : [ 15, 16, 20 ], "result" : -1 }

Dalam hal ini, ekspresi pencarian tidak ditemukan di dokumen kedua (dokumen 5). Ini karena kami memulai pencarian di posisi 1 , dan meskipun dokumen itu berisi ekspresi pencarian, itu ada di posisi 0 (sebelum posisi awal pencarian).

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.products.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", "XS", 0, 1 ] }
          }
     }
   ]
)

Hasil:

{ "sizes" : [ "XS", "M", "L" ], "result" : 0 }
{ "sizes" : [ "XS", "S", "L", "XL" ], "result" : 0 }
{ "sizes" : [ "XXS", "XS", "M", "XL" ], "result" : -1 }

Dokumen ketiga mengembalikan -1 yang berarti ekspresi penelusuran tidak ditemukan.

Inilah yang terjadi jika kita menaikkan posisi indeks akhir sebesar 1:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", "XS", 0, 2 ] }
          }
     }
   ]
)

Hasil:

{ "sizes" : [ "XS", "M", "L" ], "result" : 0 }
{ "sizes" : [ "XS", "S", "L", "XL" ], "result" : 0 }
{ "sizes" : [ "XXS", "XS", "M", "XL" ], "result" : 1 }

Kali ini nilainya dimasukkan dan posisi indeksnya dikembalikan.

Array Kosong

Mencari array kosong mengembalikan -1 .

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 6 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", "XS" ] }
          }
     }
   ]
)

Hasil:

{ "sizes" : [ ], "result" : -1 }

Bidang Tidak Ada

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

Misalkan kita memiliki dokumen berikut:

{ "_id" : 8, "prod" : "Map" }

Inilah yang terjadi ketika kita menerapkan $indexOfArray :

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 8 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", "XS" ] }
          }
     }
   ]
)

Hasil:

{ "result" : null }

Nilai Null

Jika ekspresi array adalah null (bukan array), $indexOfArray mengembalikan null .

Misalkan kita memiliki dokumen berikut:

{ "_id" : 7, "prod" : "Lap", "sizes" : null }

Inilah yang terjadi ketika kita menerapkan $indexOfArray :

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 7 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", "XS" ] }
          }
     }
   ]
)

Hasil:

{ "sizes" : null, "result" : null }

Namun, ketika ekspresi pencarian adalah null , hasilnya adalah -1 , kecuali ekspresi array juga null atau kolomnya tidak ada:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3, 4, 5, 6, 7, 8 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", null ] }
          }
     }
   ]
)

Hasil:

{ "sizes" : [ "XS", "M", "L" ], "result" : -1 }
{ "sizes" : [ "XS", "S", "L", "XL" ], "result" : -1 }
{ "sizes" : [ "XXS", "XS", "M", "XL" ], "result" : -1 }
{ "sizes" : [ 10, 12, 15 ], "result" : -1 }
{ "sizes" : [ 15, 16, 20 ], "result" : -1 }
{ "sizes" : [ ], "result" : -1 }
{ "sizes" : null, "result" : null }
{ "result" : null }

Jenis Data Salah

Jika ekspresi array adalah tipe data yang salah, $indexOfArray mengembalikan kesalahan.

Misalkan kita memiliki dokumen berikut:

{ "_id" : 9, "prod" : "Box", "sizes" : "XXL" }

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

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 9 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", "XXL" ] }
          }
     }
   ]
)

Hasil:

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$indexOfArray requires an array as a first argument, found: string",
	"code" : 40090,
	"codeName" : "Location40090"
} : 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, $indexOfArray requires an array as a first argument .


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Agregasi dengan pembaruan di mongoDB

  2. Bagaimana cara menghitung perbedaan cap waktu di mongodb (dalam jam)?

  3. DB dengan kinerja sisipan/detik terbaik?

  4. Agregasi dalam zona waktu lokal di mongodb

  5. Cara Menyebarkan Server Percona untuk MongoDB untuk Ketersediaan Tinggi