Fra MongoDB 4.4 kan du bruge $isNumber
aggregeringspipeline-operatør for at kontrollere, om en værdi er et tal eller ej.
Det accepterer ethvert gyldigt udtryk og returnerer true
hvis udtrykket er et tal, false
hvis det ikke er.
Specifikt $isNumber
kontrollerer, om udtrykket løses til en af følgende BSON-typer:
Integer
Decimal
Double
Long
Det returnerer true
hvis det gør.
Det returnerer false
hvis udtrykket løses til en anden BSON-type, null
, eller et manglende felt.
Eksempel
Antag, at vi har en samling kaldet dogs
med følgende dokument:
{ "_id" : 1, "name" : "Fetch", "weight" : 30 }
Vi kan bruge følgende kode til at se, hvilke felter der er numeriske:
db.dogs.aggregate(
[
{
$project:
{
_id: { $isNumber: "$_id" },
name: { $isNumber: "$name" },
weight: { $isNumber: "$weight" }
}
}
]
)
Resultat:
{ "_id" : true, "name" : false, "weight" : true }
Vi kan se, at _id
og weight
felter er numeriske, men name
felt er ikke (det er en streng).
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 tal eller ej:
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 }