In MongoDB können Sie das $isArray
verwenden Aggregations-Pipeline-Operator, um zu prüfen, ob ein Wert ein Array ist oder nicht.
Es akzeptiert jeden gültigen Ausdruck und gibt true
zurück wenn der Ausdruck ein Array ist, false
wenn nicht.
Beispiel
Angenommen, wir haben eine Sammlung namens test
mit folgenden Dokumenten:
{ "_id" : 1, "data" : [ ] } { "_id" : 2, "data" : [ 1, 2, 3 ] } { "_id" : 3, "data" : [ "XS", "M", "L" ] } { "_id" : 4, "data" : 123 } { "_id" : 5, "data" : "Homer Jay" }
Wir können den folgenden Code verwenden, um die data
zu überprüfen Feld für Arrays:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
{
$project:
{
_id: 1,
data: 1,
result: { $isArray: "$data" }
}
}
]
)
Ergebnis:
{ "_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 }
Wir können sehen, dass die ersten drei Dokumente Arrays enthalten und die anderen beiden nicht.
Außerdem können wir sehen, dass das erste Dokument ein leeres Array enthält. Das ist immer noch ein Array, also $isArray
gibt true
zurück .
Beispiel 2
Hier ist ein weiteres Beispiel, das verschiedene Felder mit unterschiedlichen BSON-Typen enthält.
Angenommen, wir haben eine Sammlung namens types
mit folgendem 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 ] }
Für die Zwecke dieses Artikels habe ich jedes Feld so benannt, dass es seinen BSON-Typ widerspiegelt.
Wir können jetzt den folgenden Code verwenden, um entweder true
zurückzugeben oder false
für jedes Feld, abhängig davon, ob das Feld ein Array ist oder nicht:
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()
Ergebnis:
{ "_id" : false, "double" : false, "string" : false, "boolean" : false, "date" : false, "integer" : false, "long" : false, "decimal" : false, "object" : false, "array" : true }
Fehlendes Feld
Anwenden von $isArray
zu einem Feld, das nicht existiert, ergibt false
.
Nehmen wir unseren test
an Sammlung enthält das folgende Dokument:
{ "_id" : 6 }
Und wir wenden $isArray
an zu diesem Dokument:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{
$project:
{
_id: 1,
data: 1,
result: { $isArray: "$data" }
}
}
]
)
Ergebnis:
{ "_id" : 6, "result" : false }
Nullwerte
Anwenden von $isArray
auf null
gibt false
zurück .
Nehmen wir unseren test
an Sammlung enthält das folgende Dokument:
{ "_id" : 7, "data" : null }
Und wir wenden $isArray
an zu diesem Dokument:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{
$project:
{
_id: 1,
data: 1,
result: { $isArray: "$data" }
}
}
]
)
Ergebnis:
{ "_id" : 7, "data" : null, "result" : false }
Undefinierte Werte
Ebenso gibt die Bereitstellung undefinierter Werte false
zurück .
Nehmen wir unseren test
an Sammlung enthält das folgende Dokument:
{ "_id" : 8, "data" : undefined }
Wenden Sie $isArray
an :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 8 ] } } },
{
$project:
{
_id: 1,
data: 1,
result: { $isArray: "$data" }
}
}
]
)
Ergebnis:
{ "_id" : 8, "data" : undefined, "result" : false }