$ setIsSubset
の比較
$または
よりも短いオプションです 使用している条件ですが、基本的には、実行していることを実行することは有効です。
$ setIsSubset
での唯一のキャッチ 各引数は配列であるため、単一の要素を単一の要素の配列として変換する必要があります。これは、 $ 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
]
}
}
}}
])
または、必要に応じて、引数の配列を特異値と照合します。代わりに、 $ 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
]
}
}
}}
])
$ map
の場所 単数を配列に強制するのではなく、引数をトラバースして単数に一致させます。
そしてもちろん、どちらの形式も本質的に true / false
を提供しているので $ cond
へ 次に、 $not<を使用してロジックを逆にすることができます。 / code>
必要な場合:
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
]
}
}
}}
])
それは実際にはそれをどのように見るかによって異なりますが、単に提供された引数として、$または
を使用した元のフォームから実際には何も得られません。 。少しすっきりと「入力しやすい」ように見えるかもしれませんが、通常、このようなロジックを集計パイプラインに直接「入力」するのではなく、最初にプレーンリストに基づいて構造のその部分を生成します。
つまり
var failList = [ 0,100,101,102,103,104,105 ];
var orCondition = failList.map(function(el) {
return { "$eq": [ "$id", el ] }
})
そして、パイプライン定義で再マッピングされた配列コンテンツを使用するだけです:
{ "$group": {
"_id": "$createdAt",
"count": { "$sum": 1 },
"count_failure": {
"$sum": {
"$cond": [
{ "$or": orCondition },
1,
0
]
}
}
}}
])
どのように見ても、それはすべて単なるデータ構造であり、操作するための基本的なプロセスがあることを忘れないでください。パイプライン処理内とパイプライン構築自体の両方。