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
k
pole iv
pole, gdziek
pole zawiera nazwę pola iv
pole 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 : [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 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 : [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
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 : [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 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,
$arrayToObject
uż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,
$arrayToObject
uż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,
$arrayToObject
używa ostatniej wartości tego pola. W przypadku wersji 3.4.0-3.4.19 użyta wartość zależy od sterownika.