In MongoDB is de $arrayToObject
aggregatiepijplijnoperator converteert een array naar een document.
De array geleverd aan $arrayToObject
moet een van de twee volgende formaten hebben:
- Een array van arrays met twee elementen waarbij het eerste element de veldnaam is en het tweede element de veldwaarde.
- Een array van documenten die een
k
. bevatten veld en eenv
veld, waar dek
veld bevat de veldnaam en dev
veld bevat de waarde.
Formaat 1
Stel dat we een verzameling hebben met de naam test
met het volgende document:
{ "_id" : 1, "data" : [ [ "name", "Fetch" ], [ "type", "Dog" ] ] }
We kunnen de $arrayToObject
. gebruiken operator om de data
te retourneren veld als documentobject:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
Resultaat:
{ "result" : { "name" : "Fetch", "type" : "Dog" } }
Formaat 2
Stel dat we een document hebben zoals dit:
{ "_id" : 2, "data" : [ { "k" : "name", "v" : "Fetch" }, { "k" : "type", "v" : "Dog" } ] }
In dit geval is de k
velden bevatten de sleutels en de v
velden bevatten de waarden.
Dit is wat er gebeurt als we $arrayToObject
toepassen naar dat document:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 2 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
Resultaat:
{ "result" : { "name" : "Fetch", "type" : "Dog" } }
We kunnen zien dat dit resulteerde in hetzelfde document als in het vorige voorbeeld.
Niet-conforme arrays
Het argument gegeven aan $arrayToObject
kan elke geldige uitdrukking zijn zolang deze wordt omgezet in een array van arrays van twee elementen of een array van documenten die k
bevat en v
velden.
Als het argument hier niet aan voldoet, treedt er een fout op.
Stel dat we het volgende document hebben:
{ "_id" : 3, "data" : [ [ "name", "Fetch", "Dog" ] ] }
Deze array bevat drie elementen.
Dit is wat er gebeurt als we $arrayToObject
toepassen naar dat document:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 3 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
Resultaat:
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
Zoals de fout aangeeft, vereist $arrayToObject requires an array of size 2 arrays
.
Hier is nog een document dat een niet-conforme array bevat:
{ "_id" : 4, "data" : [ { "a" : "name", "b" : "Fetch" } ] }
In dit geval gebruikt het document in de array a
en b
velden in plaats van k
en v
.
Dit is wat er gebeurt als we $arrayToObject
toepassen :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
Resultaat:
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
In dit geval geeft de fout aan dat $arrayToObject requires an object with keys 'k' and 'v'
.
Verkeerd type
Evenzo, als het argument niet eens een array is, treedt er een fout op.
Stel dat we het volgende document hebben:
{ "_id" : 5, "data" : "None" }
De data
veld bevat een tekenreeks.
Dit is wat er gebeurt als we $arrayToObject
toepassen naar dat document:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 5 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
Resultaat:
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
Zoals de fout aangeeft, vereist $arrayToObject requires an array input
.
Null-waarden
null
opgeven resulteert in null
.
Stel dat we het volgende document hebben:
{ "_id" : 6, "data" : null }
En we passen $arrayToObject
. toe :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
Resultaat:
{ "result" : null }
Ontbrekende velden
Als het veld ontbreekt, is het resultaat null
.
Stel dat we het volgende document hebben:
{ "_id" : 7 }
En we passen $arrayToObject
. toe :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
Resultaat:
{ "result" : null }
Veldnamen herhalen
Volgens de MongoDB-documentatie, als de naam van een veld in de array wordt herhaald:
- Vanaf 4.0.5,
$arrayToObject
gebruikt de laatste waarde voor dat veld. Voor 4.0.0-4.0.4 hangt de gebruikte waarde af van het stuurprogramma. - Vanaf 3.6.10,
$arrayToObject
gebruikt de laatste waarde voor dat veld. Voor 3.6.0-3.6.9 hangt de gebruikte waarde af van het stuurprogramma. - Vanaf 3.4.19,
$arrayToObject
gebruikt de laatste waarde voor dat veld. Voor 3.4.0-3.4.19 hangt de gebruikte waarde af van het stuurprogramma.