W MongoDB $objectToArray
Operator potoku agregacji konwertuje dokument na tablicę.
Tablica utworzona przez $objectToArray
zawiera element dla każdej pary pole/wartość w oryginalnym dokumencie. Każdy element jest dokumentem zawierającym k
pole i v
pole:
k
pole zawiera nazwę pola w oryginalnym dokumencie.v
pole zawiera wartość pola w oryginalnym dokumencie.
Przykład
Załóżmy, że mamy kolekcję o nazwie dogs
z następującym dokumentem:
{ "_id" : 1, "name" : "Fetch", "specs" : { "height" : 400, "weight" : 55, "color" : "brown" } }
Możemy użyć $objectToArray
operator do zwrócenia specs
pole jako tablica:
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
).pretty()
Wynik:
{ "result" : [ { "k" : "height", "v" : 400 }, { "k" : "weight", "v" : 55 }, { "k" : "color", "v" : "brown" } ] }
Dokumenty zagnieżdżone
$objectToArray
operator dotyczy tylko pola najwyższego poziomu. Nie stosuje się rekursywnie do żadnych osadzonych dokumentów.
Załóżmy, że mamy taki dokument:
{ "_id" : 2, "name" : "Wag", "specs" : { "height" : 50, "weight" : 5, "color" : { "eyes" : "brown", "coat" : "black" } } }
Oto, co się dzieje, gdy zastosujemy $objectToArray
do tego dokumentu:
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 2 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
).pretty()
Wynik:
{ "result" : [ { "k" : "height", "v" : 50 }, { "k" : "weight", "v" : 5 }, { "k" : "color", "v" : { "eyes" : "brown", "coat" : "black" } } ] }
W takim przypadku dokument najwyższego poziomu jest konwertowany na k
/v
format, ale osadzony dokument pozostaje taki sam jak w oryginalnym dokumencie.
Niewłaściwy typ
Argument dostarczony do $objectToArray
może być dowolnym prawidłowym wyrażeniem, o ile prowadzi do obiektu dokumentu.
Jeśli argument nie zostanie rozwiązany do obiektu dokumentu, wystąpi błąd.
Załóżmy, że mamy następujący dokument:
{ "_id" : 3, "name" : "Fetch", "specs" : "None" }
specs
pole zawiera ciąg.
Oto, co się dzieje, gdy zastosujemy $objectToArray
do tego dokumentu:
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 3 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
)
Wynik:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$objectToArray requires a document input, found: string", "code" : 40390, "codeName" : "Location40390" } : 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, $objectToArray requires a document input
.
Wartości puste
Podanie null
wyniki w null
.
Załóżmy, że mamy następujący dokument:
{ "_id" : 4, "name" : "Fetch", "specs" : null }
I stosujemy $objectToArray
:
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
)
Wynik:
{ "result" : null }
Brakujące pola
Jeśli brakuje pola, wynikiem jest null
.
Załóżmy, że mamy następujący dokument:
{ "_id" : 5, "name" : "Fetch" }
I stosujemy $objectToArray
:
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 5 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
)
Wynik:
{ "result" : null }