I MongoDB kan du bruge $isArray
aggregeringspipeline-operatør for at kontrollere, om en værdi er en matrix.
Det accepterer ethvert gyldigt udtryk og returnerer true
hvis udtrykket er et array, false
hvis det ikke er.
Eksempel
Antag, at vi har en samling kaldet test
med følgende dokumenter:
{ "_id" : 1, "data" : [ ] } { "_id" : 2, "data" : [ 1, 2, 3 ] } { "_id" : 3, "data" : [ "XS", "M", "L" ] } { "_id" : 4, "data" : 123 } { "_id" : 5, "data" : "Homer Jay" }
Vi kan bruge følgende kode til at kontrollere data
felt for arrays:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
{
$project:
{
_id: 1,
data: 1,
result: { $isArray: "$data" }
}
}
]
)
Resultat:
{ "_id" : 1, "data" : [ ], "result" : true } { "_id" : 2, "data" : [ 1, 2, 3 ], "result" : true } { "_id" : 3, "data" : [ "XS", "M", "L" ], "result" : true } { "_id" : 4, "data" : 123, "result" : false } { "_id" : 5, "data" : "Homer Jay", "result" : false }
Vi kan se, at de første tre dokumenter indeholder arrays, og at de to andre ikke gør.
Vi kan også se, at det første dokument indeholder et tomt array. Det er stadig et array, og så $isArray
returnerer true
.
Eksempel 2
Her er et andet eksempel, der indeholder forskellige felter med forskellige BSON-typer.
Antag, at vi har en samling kaldet types
med følgende dokument:
{ "_id" : ObjectId("601738d7c8eb4369cf6ad9de"), "double" : 123.75, "string" : "123", "boolean" : true, "date" : ISODate("2020-12-31T23:30:15.123Z"), "integer" : 123, "long" : NumberLong(123), "decimal" : NumberDecimal("123.75"), "object" : { "a" : 1 }, "array" : [ 1, 2, 3 ] }
Til formålet med denne artikel har jeg navngivet hvert felt for at afspejle dens BSON-type.
Vi kan nu bruge følgende kode til at returnere enten true
eller false
for hvert felt, afhængigt af om feltet er et array eller ej:
db.types.aggregate(
[
{
$project:
{
_id: { $isArray: "$_id" },
double: { $isArray: "$double" },
string: { $isArray: "$string" },
boolean: { $isArray: "$boolean" },
date: { $isArray: "$date" },
integer: { $isArray: "$integer" },
long: { $isArray: "$long" },
decimal: { $isArray: "$decimal" },
object: { $isArray: "$object" },
array: { $isArray: "$array" }
}
}
]
).pretty()
Resultat:
{ "_id" : false, "double" : false, "string" : false, "boolean" : false, "date" : false, "integer" : false, "long" : false, "decimal" : false, "object" : false, "array" : true }
Manglende felt
Anvender $isArray
til et felt, der ikke eksisterer, resulterer i false
.
Antag vores test
samlingen indeholder følgende dokument:
{ "_id" : 6 }
Og vi anvender $isArray
til det dokument:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{
$project:
{
_id: 1,
data: 1,
result: { $isArray: "$data" }
}
}
]
)
Resultat:
{ "_id" : 6, "result" : false }
Nul-værdier
Anvender $isArray
til null
returnerer false
.
Antag vores test
samlingen indeholder følgende dokument:
{ "_id" : 7, "data" : null }
Og vi anvender $isArray
til det dokument:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{
$project:
{
_id: 1,
data: 1,
result: { $isArray: "$data" }
}
}
]
)
Resultat:
{ "_id" : 7, "data" : null, "result" : false }
Udefinerede værdier
På samme måde returnerer levering af udefinerede værdier false
.
Antag vores test
samlingen indeholder følgende dokument:
{ "_id" : 8, "data" : undefined }
Anvend $isArray
:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 8 ] } } },
{
$project:
{
_id: 1,
data: 1,
result: { $isArray: "$data" }
}
}
]
)
Resultat:
{ "_id" : 8, "data" : undefined, "result" : false }