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:
kpole zawiera nazwę pola w oryginalnym dokumencie.vpole 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 :
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, $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 }