Di MongoDB, $arrayToObject
operator pipa agregasi mengonversi array menjadi dokumen.
Array yang disediakan untuk $arrayToObject
harus dalam salah satu dari dua format berikut:
- Larik dari larik dua elemen di mana elemen pertama adalah nama bidang, dan elemen kedua adalah nilai bidang.
- Array dokumen yang berisi
k
bidang danv
bidang, di manak
field berisi nama field danv
bidang berisi nilai.
Format 1
Misalkan kita memiliki koleksi yang disebut test
dengan dokumen berikut:
{ "_id" : 1, "data" : [ [ "name", "Fetch" ], [ "type", "Dog" ] ] }
Kita dapat menggunakan $arrayToObject
operator untuk mengembalikan data
bidang sebagai objek dokumen:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
Hasil:
{ "result" : { "name" : "Fetch", "type" : "Dog" } }
Format 2
Misalkan kita memiliki dokumen seperti ini:
{ "_id" : 2, "data" : [ { "k" : "name", "v" : "Fetch" }, { "k" : "type", "v" : "Dog" } ] }
Dalam hal ini, k
bidang berisi kunci dan v
bidang berisi nilai.
Inilah yang terjadi ketika kita menerapkan $arrayToObject
ke dokumen itu:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 2 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
Hasil:
{ "result" : { "name" : "Fetch", "type" : "Dog" } }
Kita dapat melihat bahwa ini menghasilkan dokumen yang sama dengan yang dihasilkan pada contoh sebelumnya.
Array Tidak Sesuai
Argumen yang diberikan ke $arrayToObject
dapat berupa ekspresi apa pun yang valid selama ia menyelesaikan ke larik larik dua elemen atau larik dokumen yang berisi k
dan v
bidang.
Jika argumen tidak sesuai dengan ini, akan terjadi kesalahan.
Misalkan kita memiliki dokumen berikut:
{ "_id" : 3, "data" : [ [ "name", "Fetch", "Dog" ] ] }
Array ini berisi tiga elemen.
Inilah yang terjadi ketika kita menerapkan $arrayToObject
ke dokumen itu:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 3 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
Hasil:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$arrayToObject requires an array of size 2 arrays,found array of size: 3", "code" : 40397, "codeName" : "Location40397" } : 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 kesalahan, $arrayToObject requires an array of size 2 arrays
.
Berikut dokumen lain yang berisi larik yang tidak sesuai:
{ "_id" : 4, "data" : [ { "a" : "name", "b" : "Fetch" } ] }
Dalam hal ini, dokumen dalam array menggunakan a
dan b
bidang alih-alih k
dan v
.
Inilah yang terjadi ketika kita menerapkan $arrayToObject
:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
Hasil:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$arrayToObject requires an object with keys 'k' and 'v'. Missing either or both keys from: {a: \"name\", b: \"Fetch\"}", "code" : 40393, "codeName" : "Location40393" } : 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
Dalam hal ini, kesalahan menyatakan bahwa $arrayToObject requires an object with keys 'k' and 'v'
.
Tipe Salah
Demikian pula, jika argumennya bukan array, akan terjadi kesalahan.
Misalkan kita memiliki dokumen berikut:
{ "_id" : 5, "data" : "None" }
data
bidang berisi string.
Inilah yang terjadi ketika kita menerapkan $arrayToObject
ke dokumen itu:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 5 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
Hasil:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$arrayToObject requires an array input, found: string", "code" : 40386, "codeName" : "Location40386" } : 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 kesalahan, $arrayToObject requires an array input
.
Nilai Null
Memberikan null
menghasilkan null
.
Misalkan kita memiliki dokumen berikut:
{ "_id" : 6, "data" : null }
Dan kami menerapkan $arrayToObject
:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
Hasil:
{ "result" : null }
Bidang Tidak Ada
Jika kolom tersebut tidak ada, hasilnya adalah null
.
Misalkan kita memiliki dokumen berikut:
{ "_id" : 7 }
Dan kami menerapkan $arrayToObject
:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
Hasil:
{ "result" : null }
Mengulang Nama Bidang
Menurut dokumentasi MongoDB, jika nama bidang berulang dalam larik:
- Mulai dari 4.0.5,
$arrayToObject
menggunakan nilai terakhir untuk bidang itu. Untuk 4.0.0-4.0.4, nilai yang digunakan bergantung pada driver. - Mulai dari 3.6.10,
$arrayToObject
menggunakan nilai terakhir untuk bidang itu. Untuk 3.6.0-3.6.9, nilai yang digunakan bergantung pada driver. - Mulai dari 3.4.19,
$arrayToObject
menggunakan nilai terakhir untuk bidang itu. Untuk 3.4.0-3.4.19, nilai yang digunakan bergantung pada driver.