sql >> Databáze >  >> NoSQL >> MongoDB

Jak vybrat data s danou podmínkou

upravit

mající takovou strukturu:

{
    "_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
        }
    ]
}

s dotazem jako je tento:

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

získáváme dynamický výstup a nemusíme se starat o jméno poskytovatele, protože to je pokryto generickou strukturou

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

konec úprav

Způsob, jak to můžete získat, je pomocí agregačního rámce. Protože pro každé pole máme pole, musíme je nejprve rozvinout a poté můžeme použít $project pro nastavení hodnoty pole nebo jednoduše null. Protože to vypadá jako jednoduchý dotaz, mohlo by to způsobit trochu problémů. Způsob, jak to můžeme zlepšit, je změnit strukturu dokumentu, mít řadu poskytovatelů a jednoduché pole providerType.

Níže uvedené fáze agregace:

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

výstup pak vypadá takto:

{
    "_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. Push položky do mongo pole přes mongoose

  2. Kontingenční řádky do sloupců v MongoDB

  3. Mongoose vytáhne ObjectId z pole

  4. Jak zkontrolovat, zda Mongo's $addToSet byl duplikát nebo ne