In MongoDB, il $arrayToObject
l'operatore della pipeline di aggregazione converte una matrice in un documento.
L'array fornito a $arrayToObject
deve essere in uno dei due seguenti formati:
- Un array di array a due elementi in cui il primo elemento è il nome del campo e il secondo elemento è il valore del campo.
- Un array di documenti che contengono una
k
campo e unv
campo, dove ilk
campo contiene il nome del campo e ilv
contiene il valore.
Formato 1
Supponiamo di avere una collezione chiamata test
con il seguente documento:
{ "_id" : 1, "data" : [ [ "name", "Fetch" ], [ "type", "Dog" ] ] }
Possiamo usare il $arrayToObject
operatore per restituire i data
campo come oggetto documento:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
Risultato:
{ "result" : { "name" : "Fetch", "type" : "Dog" } }
Formato 2
Supponiamo di avere un documento come questo:
{ "_id" : 2, "data" : [ { "k" : "name", "v" : "Fetch" }, { "k" : "type", "v" : "Dog" } ] }
In questo caso, il k
i campi contengono le chiavi e il v
i campi contengono i valori.
Ecco cosa succede quando applichiamo $arrayToObject
a quel documento:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 2 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
Risultato:
{ "result" : { "name" : "Fetch", "type" : "Dog" } }
Possiamo vedere che questo ha prodotto lo stesso documento che è stato prodotto nell'esempio precedente.
Matrici non conformi
L'argomento fornito a $arrayToObject
può essere qualsiasi espressione valida purché si risolva in un array di array a due elementi o array di documenti che contiene k
e v
campi.
Se l'argomento non aderisce a questo, si verifica un errore.
Supponiamo di avere il seguente documento:
{ "_id" : 3, "data" : [ [ "name", "Fetch", "Dog" ] ] }
Questa matrice contiene tre elementi.
Ecco cosa succede quando applichiamo $arrayToObject
a quel documento:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 3 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
Risultato:
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
Come indica l'errore, $arrayToObject requires an array of size 2 arrays
.
Ecco un altro documento che contiene un array non conforme:
{ "_id" : 4, "data" : [ { "a" : "name", "b" : "Fetch" } ] }
In questo caso, il documento all'interno dell'array utilizza a
e b
campi invece di k
e v
.
Ecco cosa succede quando applichiamo $arrayToObject
:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
Risultato:
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 questo caso, l'errore indica che $arrayToObject requires an object with keys 'k' and 'v'
.
Tipo errato
Allo stesso modo, se l'argomento non è nemmeno un array, si verifica un errore.
Supponiamo di avere il seguente documento:
{ "_id" : 5, "data" : "None" }
I data
il campo contiene una stringa.
Ecco cosa succede quando applichiamo $arrayToObject
a quel documento:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 5 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
Risultato:
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
Come indica l'errore, $arrayToObject requires an array input
.
Valori Nulli
Fornendo null
risulta null
.
Supponiamo di avere il seguente documento:
{ "_id" : 6, "data" : null }
E applichiamo $arrayToObject
:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
Risultato:
{ "result" : null }
Campi mancanti
Se il campo è mancante, il risultato è null
.
Supponiamo di avere il seguente documento:
{ "_id" : 7 }
E applichiamo $arrayToObject
:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
Risultato:
{ "result" : null }
Nomi campi ripetuti
Secondo la documentazione di MongoDB, se il nome di un campo si ripete nell'array:
- A partire dalla 4.0.5,
$arrayToObject
utilizza l'ultimo valore per quel campo. Per 4.0.0-4.0.4, il valore utilizzato dipende dal driver. - A partire dalla 3.6.10,
$arrayToObject
utilizza l'ultimo valore per quel campo. Per 3.6.0-3.6.9, il valore utilizzato dipende dal driver. - A partire da 3.4.19,
$arrayToObject
utilizza l'ultimo valore per quel campo. Per 3.4.0-3.4.19, il valore utilizzato dipende dal driver.