2014-06-13 15 views
25

Cố gắng tạo nguồn dữ liệu MongoDB với icCube. Ý tưởng là trả về kích thước của một mảng như một trường mới. Một cái gì đó như:

$project: 
{ 
"people": 1, 
"Count myFieldArray" : {$size : "$myFieldArray" } 
} 

Nhưng tôi nhận được cho một số hồ sơ được lỗi sau:

The argument to $size must be an Array, but was of type: EOO 

Có cách nào kích thước là 0 nếu lĩnh vực này là trống hay không một mảng (loại bỏ lỗi) ?

Trả lời

55

Bạn có thể sử dụng toán tử $ifNull tại đây. Có vẻ như lĩnh vực này là một trong hai không phải là một mảng hoặc không có mặt bởi lỗi đưa ra:

{ "$project": { 
    "people": 1, 
    "Count": { 
     "$size": { "$ifNull": [ "$myFieldArray", [] ] } 
    } 
}} 

Ngoài ra bạn có thể muốn kiểm tra sự $type trong $match bạn trong trường hợp này vẫn tồn tại nhưng không phải là một mảng.

+1

Cảm ơn rất nhiều nó hoạt động. Kỳ lạ rằng kích thước $ của một trường không xác định không phải là 0 (thực sự là 0 cho tất cả các loại mảng). Tôi mong đợi một db nonsql được leniant hơn (trong trường hợp một người đàn ông mongo db đọc này :-)) – ic3

+2

@ ic3 Không thực sự, và đó là lý do tại sao '$ ifNull' tồn tại. Các caveat tương tự áp dụng cho các nhà khai thác như '$ thư giãn', nơi bạn cần phải cẩn thận rằng mảng không rỗng hoặc mất tích nếu không bạn sẽ hoặc là kết quả trong việc loại bỏ các tài liệu phụ huynh hoặc sản xuất một lỗi tương tự. –

Các vấn đề liên quan