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

MongoDB集約選択プロジェクト

    あなたは正しい方向に進んでいるように見えましたが、 falseの値を削除する方法はいくつかあります。 条件付きから。何も返さないようにすることはできませんが、不要な値を削除することができます。

    本当に「セット」が必要で、MongoDB 2.6以降を使用できる場合は、基本的に falseを除外します。 $ setDifferenceを使用した値

    db.entities.aggregate([
        { "$unwind": "$entities" },
        { "$group": {
            "_id": "$_id",
            "A": { 
                "$addToSet": {
                    "$cond": [
                        { "$eq": [ "$entities.type", "A" ] },
                        "$entities.val",
                        false
                    ]
                }
            },
            "B": { 
                "$addToSet": {
                    "$cond": [
                        { "$eq": [ "$entities.type", "B" ] },
                        "$entities.val",
                        false
                    ]
                }
            }
        }},
        { "$project": {
            "A": {
                "$setDifference": [ "$A", [false] ]
            },
            "B": {
                "$setDifference": [ "$B", [false] ]
            }
        }}
    ])
    

    または、 $map<を使用した1つのステップと同じです。 / code> $ project内の演算子

    db.entities.aggregate([
        {"$project": {
            "A": {
                 "$setDifference": [
                     {
                         "$map": {
                             "input": "$entities",
                             "as": "el",
                             "in": {
                                 "$cond": [
                                     { "$eq": [ "$$el.type", "A" ] },
                                     "$$el.val",
                                     false
                                 ]
                             }
                         }
                     },
                     [false]
                 ]
             },
            "B": {
                 "$setDifference": [
                     {
                         "$map": {
                             "input": "$entities",
                             "as": "el",
                             "in": {
                                 "$cond": [
                                     { "$eq": [ "$$el.type", "B" ] },
                                     "$$el.val",
                                     false
                                 ]
                             }
                         }
                     },
                     [false]
                 ]
             }
        }}
    ])
    

    または、一般的な $ unwind > および $ match これらをフィルタリングする演算子:

    db.entities.aggregate([
        { "$unwind": "$entities" },
        { "$group": {
            "_id": "$_id",
            "A": { 
                "$push": {
                    "$cond": [
                        { "$eq": [ "$entities.type", "A" ] },
                        "$entities.val",
                        false
                    ]
                }
            },
            "B": { 
                "$push": {
                    "$cond": [
                        { "$eq": [ "$entities.type", "B" ] },
                        "$entities.val",
                        false
                    ]
                }
            }
        }},
        { "$unwind": "$A" },
        { "$match": { "A": { "$ne": false } } },
        { "$group": {
            "_id": "$_id",
            "A": { "$push": "$A" },
            "B": { "$first": "$B" }
        }},
        { "$unwind": "$B" },
        { "$match": { "B": { "$ne": false } } },
        { "$group": {
            "_id": "$_id",
            "A": { "$first": "$A" },
            "B": { "$push": "$B" }
        }}
    ])
    

    $ pushのいずれかを使用する 通常のアレイまたは $ addToSet ユニークなセットのために。




    1. 認識されないフィールド:documenDBの「ntoreturn」エラー

    2. MongoDBは、_idだけを返すときにCOLLSCANを使用します

    3. SpringデータとQueryDSLを使用したMongoDbクエリの投影

    4. HerokuにデプロイするためにStrongLoopLoopBackMongoDBデータソースを構成する方法