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 .