sql >> データベース >  >> NoSQL >> MongoDB

mongoアグリゲーションで$inまたは$ninを使用する方法$group$ cond

    $ 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
                    ]
                }
            }
        }}
    ])
    

    どのように見ても、それはすべて単なるデータ構造であり、操作するための基本的なプロセスがあることを忘れないでください。パイプライン処理内とパイプライン構築自体の両方。



    1. プロシージャはmongodbに存在します

    2. _idを集計から非表示にする方法は?

    3. マングースにネストされた配列を入力します

    4. express html-pdfパッケージを使用しているときに、画像が動的画像パスからレンダリングされない