So sánh trên $setIsSubset
là một tùy chọn ngắn hơn $or
điều kiện bạn đang sử dụng, mặc dù về cơ bản nó vẫn hợp lệ để làm những gì bạn đang làm.
Giải pháp duy nhất với $setIsSubset
là mỗi đối số là một mảng vì vậy bạn cần chuyển đổi phần tử đơn lẻ thành một mảng phần tử đơn lẻ. Điều này đủ dễ dàng bằng cách sử dụng $map
:
db.collectionName.aggregate([
{ "$group": {
"_id": "$createdAt",
"count": { "$sum": 1 },
"count_failure": {
"$sum": {
"$cond": [
{ "$setIsSubset": [
{ "$map": {
"input": ["A"],
"as": "el",
"in": "$id"
}},
[ 0,100,101,102,103,104,105 ],
]},
1,
0
]
}
}
}}
])
Hoặc nếu bạn thích, hãy so khớp mảng đối số với giá trị đơn lẻ thay thế bằng $anyElementTrue
:
db.collectionName.aggregate([
{ "$group": {
"_id": "$createdAt",
"count": { "$sum": 1 },
"count_failure": {
"$sum": {
"$cond": [
{ "$anyElementTrue": { "$map": {
"input": [ 0,100,101,102,103,104,105 ],
"as": "el",
"in": { "$eq": [ "$$el", "$id" ] }
}}},
1,
0
]
}
}
}}
])
Nơi $map
là duyệt các đối số để khớp với số ít hơn là buộc số ít vào một mảng.
Và tất nhiên vì cả hai biểu mẫu về cơ bản là cung cấp true/false
tới $cond
thì bạn chỉ có thể đảo ngược logic với $not
nếu được yêu cầu:
db.collectionName.aggregate([
{ "$group": {
"_id": "$createdAt",
"count": { "$sum": 1 },
"count_failure": {
"$sum": {
"$cond": [
{ "$not": [{ "$anyElementTrue": { "$map": {
"input": [ 0,100,101,102,103,104,105 ],
"as": "el",
"in": { "$eq": [ "$$el", "$id" ] }
}}}]},
1,
0
]
}
}
}}
])
Nó thực sự phụ thuộc vào cách bạn nhìn vào nó, nhưng chỉ đơn giản là các đối số được cung cấp thì bạn không thực sự thu được gì so với dạng ban đầu với $or
. Nó có thể trông gọn gàng hơn và "dễ nhập hơn" một chút, nhưng thường thì tôi sẽ không trực tiếp "gõ" logic như vậy vào đường dẫn tổng hợp, mà là tạo phần cấu trúc đó dựa trên một danh sách đơn giản ngay từ đầu:
tức là
var failList = [ 0,100,101,102,103,104,105 ];
var orCondition = failList.map(function(el) {
return { "$eq": [ "$id", el ] }
})
Và sau đó chỉ sử dụng nội dung mảng được ánh xạ lại trong định nghĩa đường ống:
{ "$group": {
"_id": "$createdAt",
"count": { "$sum": 1 },
"count_failure": {
"$sum": {
"$cond": [
{ "$or": orCondition },
1,
0
]
}
}
}}
])
Dù bạn nhìn nó theo cách nào, hãy nhớ rằng tất cả chỉ là cấu trúc dữ liệu và bạn có các quy trình cơ bản để thao tác. Cả trong quá trình xử lý đường ống và cả trong quá trình xây dựng đường ống.