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

MongoDB So khớp một mảng với $ type?

Trên thực tế, có một "gotcha" được liệt kê trong tài liệu cho $type cụ thể về mảng:

Khi được áp dụng cho mảng, $ type khớp với bất kỳ phần tử bên trong nào thuộc kiểu được chỉ định. Không có phép chiếu, điều này có nghĩa là toàn bộ mảng sẽ khớp nếu bất kỳ phần tử nào có kiểu phù hợp. Với phép chiếu, kết quả sẽ chỉ bao gồm những phần tử của loại được yêu cầu.

Vì vậy, điều đó có nghĩa là thay vì phát hiện xem "bản thân phần tử" có nằm trong mảng hay không, thứ thực sự đang được kiểm tra là "phần tử bên trong" của mảng để xem nó là kiểu gì.

Bây giờ chính tài liệu đề xuất kiểm tra JavaScript này với $where :

.find({ "$where": "return Array.isArray(this.author)" })

Nhưng tôi nghĩ điều đó khá kinh khủng vì có một cách tốt hơn.

Bí quyết nằm ở "ký hiệu dấu chấm", nơi bạn yêu cầu 0 phần tử chỉ mục của mảng thành $exists

.find({ "author.0": { "$exists": true } })

Đây chỉ là trường hợp cơ bản rằng nếu phần tử "0" tồn tại thì trường sẽ hiện diện và dữ liệu do đó là một mảng.

Một khi bạn hiểu tiền đề logic đó thì đó là bài kiểm tra khá đơn giản. Điều duy nhất không thể so khớp với điều đó là một mảng "thực sự trống", trong trường hợp đó, bạn có thể quay trở lại giải pháp thay thế JavaScript nếu cần. Nhưng điều này thực sự có thể sử dụng một chỉ mục, vì vậy sẽ được ưu tiên sử dụng biểu mẫu sau.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoNetworkError:không kết nối được với máy chủ [localhost:27017] trong lần kết nối đầu tiên [MongoNetworkError:connect ECONNREFUSED 127.0.0.1:27017]

  2. MongoDB Upsert giải thích

  3. Cách bỏ qua lỗi khóa trùng lặp một cách an toàn bằng insert_many

  4. MongoDb được cài đặt bởi Meteor như thế nào?

  5. Quản lý nhiều công nghệ cơ sở dữ liệu với ClusterControl