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 eenvveld, waar dekveld bevat de veldnaam en devveld 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 :
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
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 :
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
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 :
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
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,
$arrayToObjectgebruikt 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,
$arrayToObjectgebruikt 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,
$arrayToObjectgebruikt de laatste waarde voor dat veld. Voor 3.4.0-3.4.19 hangt de gebruikte waarde af van het stuurprogramma.