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 }