MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

MongoDB $ anyElementTrue

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 .


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB C # Truy vấn cho 'Thích' trên chuỗi

  2. Lưu trữ một số tệp nhỏ (dưới 1MB) bằng MongoDB trong NodeJS KHÔNG CÓ GridFS

  3. Cập nhật thuộc tính tài liệu nhúng trong Mongodb

  4. Bảo vệ dữ liệu của bạn với ClusterControl

  5. MongoDB dưới dạng dịch vụ cửa sổ và thiết lập bản sao