Bạn đã có ý tưởng cơ bản đúng nhưng $ vẫn tồn tại
là một điều kiện truy vấn nên chỉ witin hợp lệ $ match
. Những gì bạn muốn là mã $ ifNull >
về cơ bản thực hiện điều tương tự:
db.mycollection.aggregate( [
{ "$group": {
"_id" : { "user_id": "$user_id" },
"requestA_count": { "$sum": {
"$cond": [ { "$ifNull": ["$requestA", false] }, 1, 0 ]
} },
"requestB_count": { "$sum": {
"$cond": [ { "$ifNull": ["$requestB", false] }, 1, 0 ]
} },
"requestC_count": { "$sum": {
"$cond": [ { "$ifNull": ["$requestC", false] }, 1, 0 ]
} },
} },
{ "$project": {
"_id": 0,
"user_id": "$_id.user_id",
"requestA_count": 1,
"requestB_count": 1,
"requestC_count": 1
} }
] );
Vì vậy, $ ifNull
hoặc trả về giá trị hiện tại của trường nếu nó tồn tại hoặc đối số "bên phải" được trả về nếu nó không tồn tại. Giá trị trả về khác với false
được hiểu là true
(tất nhiên trừ khi giá trị thực sự là sai).
Về cơ bản, điều này cung cấp cho bạn cùng một chức năng kiểm tra logic về sự tồn tại của một thuộc tính trong tài liệu.