Från MongoDB 4.4 kan du använda $isNumber
aggregeringspipeline-operatör för att kontrollera om ett värde är ett tal eller inte.
Den accepterar alla giltiga uttryck och returnerar true
om uttrycket är ett tal, false
om det inte är det.
Specifikt $isNumber
kontrollerar om uttrycket löser sig till någon av följande BSON-typer:
Integer
Decimal
Double
Long
Den returnerar true
om det gör det.
Den returnerar false
om uttrycket löser sig till någon annan BSON-typ, null
, eller ett fält som saknas.
Exempel
Anta att vi har en samling som heter dogs
med följande dokument:
{ "_id" : 1, "name" : "Fetch", "weight" : 30 }
Vi kan använda följande kod för att se vilka fält som är numeriska:
db.dogs.aggregate(
[
{
$project:
{
_id: { $isNumber: "$_id" },
name: { $isNumber: "$name" },
weight: { $isNumber: "$weight" }
}
}
]
)
Resultat:
{ "_id" : true, "name" : false, "weight" : true }
Vi kan se att _id
och weight
fälten är numeriska, men name
fältet är inte (det är en sträng).
Exempel 2
Här är ett annat exempel som innehåller olika fält med olika BSON-typer.
Anta att vi har en samling som heter types
med följande 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 syftet med den här artikeln har jag döpt varje fält för att återspegla dess BSON-typ.
Vi kan nu använda följande kod för att returnera antingen true
eller false
för varje fält, beroende på om fältet är ett nummer eller inte:
db.types.aggregate(
[
{
$project:
{
_id: { $isNumber: "$_id" },
double: { $isNumber: "$double" },
string: { $isNumber: "$string" },
boolean: { $isNumber: "$boolean" },
date: { $isNumber: "$date" },
integer: { $isNumber: "$integer" },
long: { $isNumber: "$long" },
decimal: { $isNumber: "$decimal" },
object: { $isNumber: "$object" },
array: { $isNumber: "$array" }
}
}
]
).pretty()
Resultat:
{ "_id" : false, "double" : true, "string" : false, "boolean" : false, "date" : false, "integer" : true, "long" : true, "decimal" : true, "object" : false, "array" : false }