I MongoDB er $objectToArray aggregeringspipeline-operatør konverterer et dokument til et array.
Arrayet produceret af $objectToArray indeholder et element for hvert felt/værdipar i det originale dokument. Hvert element er et dokument, der indeholder en k felt og en v felt:
kfelt indeholder feltnavnet i det originale dokument.vfeltet indeholder værdien af feltet i det originale dokument.
Eksempel
Antag, at vi har en samling kaldet dogs med følgende dokument:
{
"_id" : 1,
"name" : "Fetch",
"specs" : {
"height" : 400,
"weight" : 55,
"color" : "brown"
}
}
Vi kan bruge $objectToArray operatør for at returnere specs felt som en matrix:
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
).pretty() Resultat:
{
"result" : [
{
"k" : "height",
"v" : 400
},
{
"k" : "weight",
"v" : 55
},
{
"k" : "color",
"v" : "brown"
}
]
} Indlejrede dokumenter
$objectToArray operatør gælder kun for feltet på øverste niveau. Det gælder ikke rekursivt for indlejrede dokumenter.
Antag, at vi har et dokument som dette:
{
"_id" : 2,
"name" : "Wag",
"specs" : {
"height" : 50,
"weight" : 5,
"color" : {
"eyes" : "brown",
"coat" : "black"
}
}
}
Her er, hvad der sker, når vi anvender $objectToArray til det dokument:
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 2 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
).pretty() Resultat:
{
"result" : [
{
"k" : "height",
"v" : 50
},
{
"k" : "weight",
"v" : 5
},
{
"k" : "color",
"v" : {
"eyes" : "brown",
"coat" : "black"
}
}
]
}
I dette tilfælde konverteres dokumentet på øverste niveau til k /v format, men det indlejrede dokument forbliver det samme som i det originale dokument.
Forkert type
Argumentet leveret til $objectToArray kan være et hvilket som helst gyldigt udtryk, så længe det løses til et dokumentobjekt.
Hvis argumentet ikke løses til et dokumentobjekt, opstår der en fejl.
Antag, at vi har følgende dokument:
{ "_id" : 3, "name" : "Fetch", "specs" : "None" }
specs feltet indeholder en streng.
Her er, hvad der sker, når vi anvender $objectToArray til det dokument:
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 3 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
) Resultat:
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
Som fejlen angiver, kræver $objectToArray requires a document input .
Nul-værdier
Giver null resulterer i null .
Antag, at vi har følgende dokument:
{ "_id" : 4, "name" : "Fetch", "specs" : null }
Og vi anvender $objectToArray :
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
) Resultat:
{ "result" : null } Manglende felter
Hvis feltet mangler, er resultatet null .
Antag, at vi har følgende dokument:
{ "_id" : 5, "name" : "Fetch" }
Og vi anvender $objectToArray :
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 5 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
) Resultat:
{ "result" : null }