V MongoDB, $arrayToObject operátor agregačního kanálu převede pole na dokument.
Pole poskytnuté $arrayToObject musí být v jednom ze dvou následujících formátů:
- Pole dvouprvkových polí, kde první prvek je název pole a druhý prvek je hodnota pole.
- Pole dokumentů, které obsahují
kpole avpole, kde jekpole obsahuje název pole avpole obsahuje hodnotu.
Formát 1
Předpokládejme, že máme kolekci nazvanou test s následujícím dokumentem:
{
"_id" : 1,
"data" : [
[
"name",
"Fetch"
],
[
"type",
"Dog"
]
]
}
Můžeme použít $arrayToObject operátor vrátí data pole jako objekt dokumentu:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
) Výsledek:
{ "result" : { "name" : "Fetch", "type" : "Dog" } } Formát 2
Předpokládejme, že máme dokument jako tento:
{
"_id" : 2,
"data" : [
{
"k" : "name",
"v" : "Fetch"
},
{
"k" : "type",
"v" : "Dog"
}
]
}
V tomto případě k pole obsahují klíče a v pole obsahují hodnoty.
Zde je to, co se stane, když použijeme $arrayToObject k tomuto dokumentu:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 2 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
) Výsledek:
{ "result" : { "name" : "Fetch", "type" : "Dog" } } Můžeme vidět, že to vedlo ke stejnému dokumentu, který byl vytvořen v předchozím příkladu.
Nevyhovující pole
Argument poskytnutý $arrayToObject může být jakýkoli platný výraz, pokud se převede na pole dvouprvkových polí nebo pole dokumentů, které obsahuje k a v pole.
Pokud argument toto nevyhovuje, dojde k chybě.
Předpokládejme, že máme následující dokument:
{ "_id" : 3, "data" : [ [ "name", "Fetch", "Dog" ] ] } Toto pole obsahuje tři prvky.
Zde je to, co se stane, když použijeme $arrayToObject k tomuto dokumentu:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 3 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
) Výsledek:
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
Jak uvádí chyba, $arrayToObject requires an array of size 2 arrays .
Zde je další dokument, který obsahuje nevyhovující pole:
{ "_id" : 4, "data" : [ { "a" : "name", "b" : "Fetch" } ] }
V tomto případě dokument v poli používá a a b pole namísto k a v .
Zde je to, co se stane, když použijeme $arrayToObject :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
) Výsledek:
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
V tomto případě chyba uvádí, že $arrayToObject requires an object with keys 'k' and 'v' .
Špatný typ
Podobně, pokud argument není ani pole, dojde k chybě.
Předpokládejme, že máme následující dokument:
{ "_id" : 5, "data" : "None" }
data pole obsahuje řetězec.
Zde je to, co se stane, když použijeme $arrayToObject k tomuto dokumentu:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 5 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
) Výsledek:
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
Jak uvádí chyba, $arrayToObject requires an array input .
Nulové hodnoty
Poskytování null výsledkem je null .
Předpokládejme, že máme následující dokument:
{ "_id" : 6, "data" : null }
A použijeme $arrayToObject :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
) Výsledek:
{ "result" : null } Chybějící pole
Pokud pole chybí, je výsledkem null .
Předpokládejme, že máme následující dokument:
{ "_id" : 7 }
A použijeme $arrayToObject :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
) Výsledek:
{ "result" : null } Opakující se názvy polí
Podle dokumentace MongoDB, pokud se název pole opakuje v poli:
- Od verze 4.0.5
$arrayToObjectpoužívá poslední hodnotu pro toto pole. U 4.0.0-4.0.4 závisí použitá hodnota na ovladači. - Od 3.6.10
$arrayToObjectpoužívá poslední hodnotu pro toto pole. U 3.6.0-3.6.9 závisí použitá hodnota na ovladači. - Počínaje verzí 3.4.19
$arrayToObjectpoužívá poslední hodnotu pro toto pole. U 3.4.0-3.4.19 závisí použitá hodnota na ovladači.