In MongoDB kun je de $isArray
. gebruiken aggregatiepijplijnoperator om te controleren of een waarde al dan niet een array is.
Het accepteert elke geldige uitdrukking en retourneert true
als de uitdrukking een array is, false
als dat niet het geval is.
Voorbeeld
Stel dat we een verzameling hebben met de naam test
met de volgende documenten:
{ "_id" : 1, "data" : [ ] } { "_id" : 2, "data" : [ 1, 2, 3 ] } { "_id" : 3, "data" : [ "XS", "M", "L" ] } { "_id" : 4, "data" : 123 } { "_id" : 5, "data" : "Homer Jay" }
We kunnen de volgende code gebruiken om de data
te controleren veld voor arrays:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
{
$project:
{
_id: 1,
data: 1,
result: { $isArray: "$data" }
}
}
]
)
Resultaat:
{ "_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 }
We kunnen zien dat de eerste drie documenten arrays bevatten en de andere twee niet.
We kunnen ook zien dat het eerste document een lege array bevat. Dat is nog steeds een array, en dus $isArray
retourneert true
.
Voorbeeld 2
Hier is nog een voorbeeld dat verschillende velden van verschillende BSON-typen bevat.
Stel dat we een verzameling hebben met de naam types
met het volgende document:
{ "_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 ] }
Voor het doel van dit artikel heb ik elk veld een naam gegeven om het BSON-type weer te geven.
We kunnen nu de volgende code gebruiken om true
. te retourneren of false
voor elk veld, afhankelijk van of het veld al dan niet een array is:
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()
Resultaat:
{ "_id" : false, "double" : false, "string" : false, "boolean" : false, "date" : false, "integer" : false, "long" : false, "decimal" : false, "object" : false, "array" : true }
Ontbrekend veld
$isArray
toepassen naar een veld dat niet bestaat resulteert in false
.
Stel dat onze test
collectie bevat het volgende document:
{ "_id" : 6 }
En we passen $isArray
. toe naar dat document:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{
$project:
{
_id: 1,
data: 1,
result: { $isArray: "$data" }
}
}
]
)
Resultaat:
{ "_id" : 6, "result" : false }
Null-waarden
$isArray
toepassen naar null
retourneert false
.
Stel dat onze test
collectie bevat het volgende document:
{ "_id" : 7, "data" : null }
En we passen $isArray
. toe naar dat document:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{
$project:
{
_id: 1,
data: 1,
result: { $isArray: "$data" }
}
}
]
)
Resultaat:
{ "_id" : 7, "data" : null, "result" : false }
Ongedefinieerde waarden
Op dezelfde manier retourneert het leveren van ongedefinieerde waarden false
.
Stel dat onze test
collectie bevat het volgende document:
{ "_id" : 8, "data" : undefined }
Pas $isArray
toe :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 8 ] } } },
{
$project:
{
_id: 1,
data: 1,
result: { $isArray: "$data" }
}
}
]
)
Resultaat:
{ "_id" : 8, "data" : undefined, "result" : false }