Trong MongoDB, $anyElementTrue
toán tử đường ống tổng hợp đánh giá một mảng là một tập hợp và trả về true
nếu bất kỳ phần tử nào là true
.
Nếu không có phần tử nào là true
, sau đó nó trả về false
.
Phần tử của mảng là true
nếu nó không phải là false
, null
, 0
hoặc undefined
.
Ví dụ
Giả sử chúng ta có một bộ sưu tập với tài liệu sau:
{ "_id" : 1, "data" : [ 1, 2, 3 ] }
Tài liệu này chứa một mảng.
Chúng tôi có thể chạy truy vấn sau với $anyElementTrue
để tìm hiểu xem mảng có chứa bất kỳ phần tử nào đánh giá thành true
hay không :
db.test.aggregate(
[
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Kết quả:
{ "anyElementTrue" : true }
Trong trường hợp này, tất cả các phần tử mảng đánh giá thành true
(nghĩa là chúng không phải là false
, null
, 0
hoặc undefined
), và do đó chúng tôi nhận được kết quả là true
.
Khi không có phần tử nào là True
Hãy thêm tài liệu sau vào bộ sưu tập:
{ "_id" : 2, "data" : [ false, undefined, 0, null ] }
Và hãy chạy $anyElementTrue
chống lại tài liệu đó:
db.test.aggregate(
[
{ $match: { _id: 2 } },
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Kết quả:
{ "anyElementTrue" : false }
Như chúng ta có thể thấy ở đây, $anyElementTrue
đánh giá thành false
bất cứ khi nào một mảng chứa false
, null
, 0
hoặc undefined
giá trị.
Khi mảng chứa cả Đúng và Sai
Hãy thêm tài liệu sau vào bộ sưu tập:
{ "_id" : 3, "data" : [ true, false ] }
Và hãy chạy $anyElementTrue
chống lại tài liệu đó:
db.test.aggregate(
[
{ $match: { _id: 3 } },
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Kết quả:
{ "anyElementTrue" : true }
Chúng tôi nhận được true
, mặc dù có một phần tử khác false
. Điều này được mong đợi, bởi vì $anyElementTrue
trả về true
bất cứ khi nào có ít nhất một phần tử true
, bất kể có bao nhiêu phần tử khác là sai.
Mảng trống
Mảng trống trả về true
.
Giả sử chúng ta thêm tài liệu sau vào bộ sưu tập của mình:
{ "_id" : 4, "data" : [ ] }
Tài liệu này chứa một mảng trống.
Bây giờ chúng ta hãy chạy $anyElementTrue
một lần nữa:
db.test.aggregate(
[
{ $match: { _id: 4 } },
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Kết quả:
{ "anyElementTrue" : false }
Nó trả về false
, bởi vì một mảng trống không phải là false
.
Mảng lồng nhau
$anyElementTrue
nhà điều hành không không xuống bất kỳ mảng lồng nhau nào. Nó đánh giá mảng ở cấp cao nhất.
Do đó, liệu mảng lồng nhau có chứa các phần tử true
hay không hoặc false
không liên quan đến $anyElementTrue
. Theo như $anyElementTrue
có liên quan, mảng lồng nhau là phần tử và do đó true
.
Để chứng minh ý tôi, giả sử chúng ta chèn các tài liệu sau:
{ "_id" : 5, "data" : [ false, [ false ] ] } { "_id" : 6, "data" : [ false, false ] }
Bây giờ chúng ta hãy chạy $anyElementTrue
chống lại hai tài liệu đó:
db.test.aggregate(
[
{ $match: {_id: { $in: [5,6] }} },
{ $project: {
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Kết quả:
{ "_id" : 5, "anyElementTrue" : true } { "_id" : 6, "anyElementTrue" : false }
Chúng ta có thể thấy rằng tài liệu đầu tiên trả về true
và thứ hai trả về false
.
Điều này là do, mảng trong tài liệu đầu tiên chứa một mảng lồng nhau, đủ để trả về true
, bất kể nội dung của nó.
Tài liệu thứ hai không chứa một mảng lồng nhau - nó chỉ chứa hai false
giá trị - và do đó nó đánh giá thành false
.