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
kbidang danvbidang, di manakfield berisi nama field danvbidang 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 :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/assert.js:18:14
example@sqldat.com/mongo/shell/assert.js:639:17
example@sqldat.com/mongo/shell/assert.js:729:16
example@sqldat.com/mongo/shell/db.js:266:5
example@sqldat.com/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 :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/assert.js:18:14
example@sqldat.com/mongo/shell/assert.js:639:17
example@sqldat.com/mongo/shell/assert.js:729:16
example@sqldat.com/mongo/shell/db.js:266:5
example@sqldat.com/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 :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/assert.js:18:14
example@sqldat.com/mongo/shell/assert.js:639:17
example@sqldat.com/mongo/shell/assert.js:729:16
example@sqldat.com/mongo/shell/db.js:266:5
example@sqldat.com/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,
$arrayToObjectmenggunakan nilai terakhir untuk bidang itu. Untuk 4.0.0-4.0.4, nilai yang digunakan bergantung pada driver. - Mulai dari 3.6.10,
$arrayToObjectmenggunakan nilai terakhir untuk bidang itu. Untuk 3.6.0-3.6.9, nilai yang digunakan bergantung pada driver. - Mulai dari 3.4.19,
$arrayToObjectmenggunakan nilai terakhir untuk bidang itu. Untuk 3.4.0-3.4.19, nilai yang digunakan bergantung pada driver.