W MongoDB $arrayToObject Operator potoku agregacji konwertuje tablicę na dokument.
Tablica dostarczona do $arrayToObject musi być w jednym z dwóch następujących formatów:
- Tablica dwuelementowych tablic, w której pierwszy element to nazwa pola, a drugi element to wartość pola.
- Tabela dokumentów zawierających
kpole ivpole, gdziekpole zawiera nazwę pola ivpole zawiera wartość.
Format 1
Załóżmy, że mamy kolekcję o nazwie test z następującym dokumentem:
{
"_id" : 1,
"data" : [
[
"name",
"Fetch"
],
[
"type",
"Dog"
]
]
}
Możemy użyć $arrayToObject operator do zwrócenia data pole jako obiekt dokumentu:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
) Wynik:
{ "result" : { "name" : "Fetch", "type" : "Dog" } } Format 2
Załóżmy, że mamy taki dokument:
{
"_id" : 2,
"data" : [
{
"k" : "name",
"v" : "Fetch"
},
{
"k" : "type",
"v" : "Dog"
}
]
}
W tym przypadku k pola zawierają klucze i v pola zawierają wartości.
Oto, co się dzieje, gdy zastosujemy $arrayToObject do tego dokumentu:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 2 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
) Wynik:
{ "result" : { "name" : "Fetch", "type" : "Dog" } } Widzimy, że w wyniku tego powstał ten sam dokument, który został wyprodukowany w poprzednim przykładzie.
Niezgodne tablice
Argument dostarczony do $arrayToObject może być dowolnym poprawnym wyrażeniem, pod warunkiem, że zostanie rozwiązany jako tablica dwuelementowych tablic lub tablica dokumentów zawierająca k i v pola.
Jeśli argument nie jest zgodny z tym, pojawia się błąd.
Załóżmy, że mamy następujący dokument:
{ "_id" : 3, "data" : [ [ "name", "Fetch", "Dog" ] ] } Ta tablica zawiera trzy elementy.
Oto, co się dzieje, gdy zastosujemy $arrayToObject do tego dokumentu:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 3 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
) Wynik:
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 stwierdza błąd, $arrayToObject requires an array of size 2 arrays .
Oto kolejny dokument zawierający niezgodną tablicę:
{ "_id" : 4, "data" : [ { "a" : "name", "b" : "Fetch" } ] }
W tym przypadku dokument w tablicy używa a i b pola zamiast k i v .
Oto, co się dzieje, gdy zastosujemy $arrayToObject :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
) Wynik:
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
W tym przypadku błąd stwierdza, że $arrayToObject requires an object with keys 'k' and 'v' .
Niewłaściwy typ
Podobnie, jeśli argument nie jest nawet tablicą, pojawia się błąd.
Załóżmy, że mamy następujący dokument:
{ "_id" : 5, "data" : "None" }
data pole zawiera ciąg.
Oto, co się dzieje, gdy zastosujemy $arrayToObject do tego dokumentu:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 5 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
) Wynik:
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 stwierdza błąd, $arrayToObject requires an array input .
Wartości puste
Podanie null wyniki w null .
Załóżmy, że mamy następujący dokument:
{ "_id" : 6, "data" : null }
I stosujemy $arrayToObject :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
) Wynik:
{ "result" : null } Brakujące pola
Jeśli brakuje pola, wynikiem jest null .
Załóżmy, że mamy następujący dokument:
{ "_id" : 7 }
I stosujemy $arrayToObject :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
) Wynik:
{ "result" : null } Powtarzające się nazwy pól
Zgodnie z dokumentacją MongoDB, jeśli nazwa pola powtarza się w tablicy:
- Począwszy od 4.0.5,
$arrayToObjectużywa ostatniej wartości dla tego pola. W przypadku wersji 4.0.0-4.0.4 użyta wartość zależy od sterownika. - Od wersji 3.6.10,
$arrayToObjectużywa ostatniej wartości dla tego pola. W przypadku wersji 3.6.0-3.6.9 użyta wartość zależy od sterownika. - Od wersji 3.4.19,
$arrayToObjectużywa ostatniej wartości tego pola. W przypadku wersji 3.4.0-3.4.19 użyta wartość zależy od sterownika.