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

MongoDB $kisaran

Di MongoDB, $range operator pipeline agregasi mengembalikan urutan angka yang dihasilkan dalam larik.

Urutan angka ini didasarkan pada nilai input yang Anda berikan.

Sintaks

Sintaksnya seperti ini:

{ $range: [ <start>, <end>, <non-zero step> ] }

Dimana <start> adalah awal dan <end> adalah akhir dari urutan. Masing-masing dapat berupa ekspresi valid apa pun yang diselesaikan ke bilangan bulat.

<non-zero step> adalah argumen opsional yang default ke 1. Argumen ini memungkinkan Anda untuk menentukan nilai kenaikan. Jika disediakan, itu harus berupa ekspresi valid yang menghasilkan bilangan bulat bukan nol.

Contoh

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

{ "_id" : 1, "start" : 0, "end" : 5 }
{ "_id" : 2, "start" : 1, "end" : 5 }

Kita dapat menggunakan $range operator untuk mengembalikan array berdasarkan nilai dalam dokumen tersebut.

db.range.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2 ] } } },
     {
       $project:
          {
            _id: 0,
            start: 1,
            end: 1,
            result: { $range: [ "$start", "$end" ] }
          }
     }
   ]
)

Hasil:

{ "start" : 0, "end" : 5, "result" : [ 0, 1, 2, 3, 4 ] }
{ "start" : 1, "end" : 5, "result" : [ 1, 2, 3, 4 ] }

Dalam hal ini, kami tidak memberikan argumen ketiga, jadi $range menggunakan nilai langkah default 1. Oleh karena itu, elemen array bertambah 1.

Tambahkan Peningkatan Eksplisit

Kita dapat menambahkan argumen ketiga untuk secara eksplisit menentukan berapa banyak setiap elemen array harus bertambah.

Misalkan koleksi kami berisi dokumen-dokumen berikut:

{ "_id" : 3, "start" : 0, "end" : 5, "step" : 1 }
{ "_id" : 4, "start" : 0, "end" : 10, "step" : 2 }
{ "_id" : 5, "start" : 1, "end" : 10, "step" : 2 }
{ "_id" : 6, "start" : 100, "end" : 150, "step" : 10 }

Dokumen-dokumen ini memiliki step bidang, sehingga kita dapat menggunakan bidang itu untuk nilai yang bertambah untuk masing-masing dokumen.

Sekarang mari kita terapkan $range ke dokumen tersebut, dan sertakan step field sebagai argumen ketiga:

db.range.aggregate(
   [
     { $match: { _id: { $in: [ 3, 4, 5, 6 ] } } },
     {
       $project:
          {
            _id: 0,
            start: 1,
            end: 1,
            step: 1,
            result: { $range: [ "$start", "$end", "$step" ] }
          }
     }
   ]
)

Hasil:

{ "start" : 0, "end" : 5, "step" : 1, "result" : [ 0, 1, 2, 3, 4 ] }
{ "start" : 0, "end" : 10, "step" : 2, "result" : [ 0, 2, 4, 6, 8 ] }
{ "start" : 1, "end" : 10, "step" : 2, "result" : [ 1, 3, 5, 7, 9 ] }
{ "start" : 100, "end" : 150, "step" : 10, "result" : [ 100, 110, 120, 130, 140 ] }

Nilai Langkah Negatif

Langkah dapat bernilai negatif, meskipun ini perlu dilakukan dalam konteks penurunan dari start yang lebih tinggi nomor ke end yang lebih rendah nomor.

Mari tambahkan beberapa dokumen lagi ke koleksi kami:

{ "_id" : 7, "start" : 0, "end" : 5, "step" : -1 }
{ "_id" : 8, "start" : 5, "end" : 0, "step" : -1 }
{ "_id" : 9, "start" : 0, "end" : -5, "step" : -1 }

Sekarang mari kita terapkan $range ke dokumen-dokumen itu:

db.range.aggregate(
   [
     { $match: { _id: { $in: [ 7, 8, 9 ] } } },
     {
       $project:
          {
            _id: 0,
            start: 1,
            end: 1,
            step: 1,
            result: { $range: [ "$start", "$end", "$step" ] }
          }
     }
   ]
)

Hasil:

{ "start" : 0, "end" : 5, "step" : -1, "result" : [ ] }
{ "start" : 5, "end" : 0, "step" : -1, "result" : [ 5, 4, 3, 2, 1 ] }
{ "start" : 0, "end" : -5, "step" : -1, "result" : [ 0, -1, -2, -3, -4 ] }

Kita dapat melihat bahwa dokumen pertama mengembalikan array kosong karena nilai langkah negatif berada di luar rentang yang disediakan oleh start dan end bidang.

Namun, dokumen berikutnya menghasilkan rentang nilai yang semakin menurun.

Saat Langkahnya Nol

Nilai langkah harus berupa bilangan bulat bukan nol. Memberikan langkah 0 mengembalikan kesalahan.

Misalkan kita menambahkan dokumen berikut ke koleksi kita:

{ "_id" : 10, "start" : 1, "end" : 5, "step" : 0 }

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

db.range.aggregate(
   [
     { $match: { _id: { $in: [ 10 ] } } },
     {
       $project:
          {
            _id: 0,
            start: 1,
            end: 1,
            result: { $range: [ "$start", "$end", "$step" ] }
          }
     }
   ]
)

Hasil:

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$range requires a non-zero step value",
	"code" : 34449,
	"codeName" : "Location34449"
} : 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

Pesan kesalahan secara eksplisit memberi tahu kita bahwa $range requires a non-zero step value .

Langkah Null

Langkahnya tidak boleh null baik.

Misalkan kita memiliki dokumen berikut:

{ "_id" : 11, "start" : 1, "end" : 5, "step" : null }

Dan kami menerapkan $range untuk itu:

db.range.aggregate(
   [
     { $match: { _id: { $in: [ 11 ] } } },
     {
       $project:
          {
            _id: 0,
            start: 1,
            end: 1,
            result: { $range: [ "$start", "$end", "$step" ] }
          }
     }
   ]
)

Hasil:

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$range requires a numeric step value, found value of type:null",
	"code" : 34447,
	"codeName" : "Location34447"
} : 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

Ini memberitahu kita bahwa $range requires a numeric step value, found value of type:null .

Rentang Null

Jika start dan/atau end kolom adalah null , maka kesalahan akan ditampilkan.

Misalkan kita memiliki dokumen berikut:

{ "_id" : 11, "start" : 1, "end" : 5, "step" : null }

Dan terapkan $range untuk itu:

db.range.aggregate(
   [
     { $match: { _id: { $in: [ 11 ] } } },
     {
       $project:
          {
            _id: 0,
            start: 1,
            end: 1,
            result: { $range: [ "$start", "$end", "$step" ] }
          }
     }
   ]
)

Hasil:

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$range requires a numeric starting value, found value of type: null",
	"code" : 34443,
	"codeName" : "Location34443"
} : 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

Ini memberitahu kita bahwa $range requires a numeric starting value, found value of type: null .

Pesan serupa akan muncul jika nilai akhir adalah nol.

Ini adalah dokumen dengan null nilai akhir:

{ "_id" : 13, "start" : 1, "end" : null, "step" : 1 }

Ayo terapkan $range :

db.range.aggregate(
   [
     { $match: { _id: { $in: [ 13 ] } } },
     {
       $project:
          {
            _id: 0,
            start: 1,
            end: 1,
            result: { $range: [ "$start", "$end", "$step" ] }
          }
     }
   ]
)

Hasil:

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$range requires a numeric ending value, found value of type: null",
	"code" : 34445,
	"codeName" : "Location34445"
} : 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

Kali ini memberitahu kita bahwa $range requires a numeric ending value, found value of type: null .


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Kinerja MongoDB:Menjalankan Agregasi MongoDB Pada Sekunder

  2. Cara memformat data dalam Model sebelum menyimpan di Mongoose (ExpressJS)

  3. MongoDB $avg Aggregation Pipeline Operator

  4. MongoDB $slice

  5. Apa cara yang benar untuk memulai layanan mongod di linux / OS X?