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.