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í
k
pole av
pole, kde jek
pole obsahuje název pole av
pole 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 : [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
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 : [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
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 : [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
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
$arrayToObject
použí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
$arrayToObject
použí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
$arrayToObject
používá poslední hodnotu pro toto pole. U 3.4.0-3.4.19 závisí použitá hodnota na ovladači.