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

与えられた条件でデータを選択する方法

    編集

    このような構造を持つ:

    {
        "_id" : ObjectId("575e4c8731dcfb59af388e1d"),
        "name" : "Maria",
        "providers" : [ 
            {
                "type" : "facebook",
                "data" : "fb.com",
                "privacy" : true
            }, 
            {
                "type" : "twitter",
                "data" : "twitter.com",
                "privacy" : false
            }, 
            {
                "type" : "google",
                "data" : "google.com",
                "privacy" : true
            }, 
            {
                "type" : "phno",
                "data" : "+1-1289741824124",
                "privacy" : true
            }
        ]
    }
    

    このようなクエリで:

    db.maria.aggregate([{
                $project : {
                    _id : 1,
                    name : 1,
                    "providers" : {
                        $filter : {
                            input : "$providers",
                            as : "p",
                            cond : {
                                $eq : ["$$p.privacy", true]
                            }
                        }
                    }
                }
            }
        ])
        ])
    

    動的な出力を取得しています。これは一般的な構造でカバーされているため、プロバイダー名を気にする必要はありません

    {
        "providers" : [ 
            {
                "type" : "facebook",
                "data" : "fb.com",
                "privacy" : true
            }, 
            {
                "type" : "google",
                "data" : "google.com",
                "privacy" : true
            }, 
            {
                "type" : "phno",
                "data" : "+1-1289741824124",
                "privacy" : true
            }
        ],
        "name" : "Maria"
    }
    

    編集の終了

    これを取得する方法は、集計フレームワークを使用することです。各フィールドに配列があるため、最初にそれを解凍してから、$projectを使用できます。 フィールド値を設定するか、単にnullにします。これは単純なクエリのように見えるため、少し問題が発生する可能性があります。これを改善する方法は、ドキュメント構造を変更して、プロバイダーの配列と単純なproviderTypeフィールドを作成することです。

    以下の集約段階:

    db.maria.find()
    var unwindFb = {
        $unwind : "$facebook"
    }
    var unwindtw = {
        $unwind : "$twitter"
    }
    var unwindgo = {
        $unwind : "$google"
    }
    var unwindph = {
        $unwind : "$phno"
    }
    var project = {
        $project : {
            _id : 1,
            name : 1, // list other fields here
    
            facebook : {
                $cond : {
                    if  : {
                        $gte : ["$facebook.privacy", true]
                    },
                then : [{
                        data : "$facebook.data",
                        privacy : "$facebook.privacy"
                    }
                ],
                else  : null
            }
        },
        twitter : {
            $cond : {
                if  : {
                    $gte : ["$twitter.privacy", true]
                },
            then : [{
                    data : "$twitter.data",
                    privacy : "$twitter.privacy"
                }
            ],
            else  : null
        }
    },
    google : {
        $cond : {
            if  : {
                $gte : ["$google.privacy", true]
            },
        then : [{
                data : "$google.data",
                privacy : "$google.privacy"
            }
        ],
        else  : null
    }
    },
    phno : {
        $cond : {
            if  : {
                $gte : ["$phno.privacy", true]
            },
        then : [{
                data : "$phno.data",
                privacy : "$phno.privacy"
            }
        ],
        else  : null
    }
    }
    }
    }
    
    db.maria.aggregate([unwindFb, unwindtw, unwindgo, unwindph, project])
    

    その場合、出力は次のようになります。

    {
        "_id" : ObjectId("575df49d31dcfb59af388e1a"),
        "name" : "Maria",
        "facebook" : [ 
            {
                "data" : "fb.com",
                "privacy" : true
            }
        ],
        "twitter" : null,
        "google" : [ 
            {
                "data" : "google.com",
                "privacy" : true
            }
        ],
        "phno" : [ 
            {
                "data" : "+1-1289741824124",
                "privacy" : true
            }
        ]
    }
    


    1. 高速書き込みの一時的な行ストレージソリューションのためのMongoDB対Redis対Cassandra

    2. 外部インジェクション攻撃からMongoDBを保護する

    3. ハイフンやスペースなどの特殊文字で構成される文字列を照合する方法

    4. MongoDbは、他のコレクションのカウントでコレクションを並べ替えます