Từ MongoDB 4.4, bạn có thể sử dụng $isNumber
toán tử đường ống tổng hợp để kiểm tra xem một giá trị có phải là một số hay không.
Nó chấp nhận bất kỳ biểu thức hợp lệ nào và trả về true
nếu biểu thức là một số, false
nếu không.
Cụ thể, $isNumber
kiểm tra xem biểu thức có phân giải thành một trong các loại BSON sau đây không:
-
Integer
-
Decimal
-
Double
-
Long
Nó trả về true
nếu nó không.
Nó trả về false
nếu biểu thức phân giải thành bất kỳ loại BSON nào khác, null
hoặc một trường bị thiếu.
Ví dụ
Giả sử chúng ta có một bộ sưu tập có tên là dogs
với tài liệu sau:
{ "_id" : 1, "name" : "Fetch", "weight" : 30 }
Chúng ta có thể sử dụng đoạn mã sau để xem trường nào là số:
db.dogs.aggregate(
[
{
$project:
{
_id: { $isNumber: "$_id" },
name: { $isNumber: "$name" },
weight: { $isNumber: "$weight" }
}
}
]
)
Kết quả:
{ "_id" : true, "name" : false, "weight" : true }
Chúng ta có thể thấy rằng _id
và weight
các trường là số, nhưng name
không phải là trường (nó là một chuỗi).
Ví dụ 2
Dưới đây là một ví dụ khác chứa nhiều trường thuộc các loại BSON khác nhau.
Giả sử chúng ta có một tập hợp được gọi là types
với tài liệu sau:
{ "_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 ] }
Với mục đích của bài viết này, tôi đã đặt tên cho mỗi trường để phản ánh loại BSON của nó.
Bây giờ chúng tôi có thể sử dụng mã sau để trả về true
hoặc false
cho mỗi trường, tùy thuộc vào trường có phải là một số hay không:
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()
Kết quả:
{ "_id" : false, "double" : true, "string" : false, "boolean" : false, "date" : false, "integer" : true, "long" : true, "decimal" : true, "object" : false, "array" : false }