Trong MongoDB, bạn có thể sử dụng $isArray
toán tử đường ống tổng hợp để kiểm tra xem một giá trị có phải là một mảng 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 mảng, false
nếu không.
Ví dụ
Giả sử chúng ta có một bộ sưu tập được gọi là test
với các tài liệu sau:
{ "_id" : 1, "data" : [ ] } { "_id" : 2, "data" : [ 1, 2, 3 ] } { "_id" : 3, "data" : [ "XS", "M", "L" ] } { "_id" : 4, "data" : 123 } { "_id" : 5, "data" : "Homer Jay" }
Chúng ta có thể sử dụng mã sau để kiểm tra data
trường cho mảng:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
{
$project:
{
_id: 1,
data: 1,
result: { $isArray: "$data" }
}
}
]
)
Kết quả:
{ "_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 }
Chúng ta có thể thấy rằng ba tài liệu đầu tiên chứa mảng và hai tài liệu còn lại thì không.
Ngoài ra, chúng ta có thể thấy rằng tài liệu đầu tiên chứa một mảng trống. Đó vẫn là một mảng và vì vậy $isArray
trả về true
.
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 mảng hay không:
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()
Kết quả:
{ "_id" : false, "double" : false, "string" : false, "boolean" : false, "date" : false, "integer" : false, "long" : false, "decimal" : false, "object" : false, "array" : true }
Thiếu trường
Áp dụng $isArray
đến một trường không tồn tại dẫn đến false
.
Giả sử test
của chúng tôi bộ sưu tập chứa tài liệu sau:
{ "_id" : 6 }
Và chúng tôi áp dụng $isArray
vào tài liệu đó:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{
$project:
{
_id: 1,
data: 1,
result: { $isArray: "$data" }
}
}
]
)
Kết quả:
{ "_id" : 6, "result" : false }
Giá trị rỗng
Áp dụng $isArray
thành null
trả về false
.
Giả sử test
của chúng tôi bộ sưu tập chứa tài liệu sau:
{ "_id" : 7, "data" : null }
Và chúng tôi áp dụng $isArray
vào tài liệu đó:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{
$project:
{
_id: 1,
data: 1,
result: { $isArray: "$data" }
}
}
]
)
Kết quả:
{ "_id" : 7, "data" : null, "result" : false }
Giá trị không xác định
Tương tự như vậy, việc cung cấp các giá trị không xác định sẽ trả về false
.
Giả sử test
của chúng tôi bộ sưu tập chứa tài liệu sau:
{ "_id" : 8, "data" : undefined }
Áp dụng $isArray
:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 8 ] } } },
{
$project:
{
_id: 1,
data: 1,
result: { $isArray: "$data" }
}
}
]
)
Kết quả:
{ "_id" : 8, "data" : undefined, "result" : false }