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