MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB :Existence d'une clé imbriquée

Avec la version MongoDb>=3.6, vous pouvez tirer parti de l'opérateur $expr dans votre requête et utilisez le $objectToArray opérateur pour convertir l'objet dynamique en tableau, filtrez le tableau pour le champ de valeur de travail à l'aide de $ifNull comme opérateur conditionnel.

L'exemple suivant illustre cette approche :

db.collection.find({
    $expr: {
        $gt: [
            {
                $size: {
                    $filter: {
                        input: { $objectToArray: '$$ROOT' },
                        cond: { 
                            $ifNull: ['$$this.v.work', false]
                        }
                    }
                }
            },
            0
        ]
    }
})

Ce n'est pas une bonne pratique d'avoir des valeurs comme clés et actuellement (et probablement à l'avenir également), il n'est pas possible d'interroger les collections MongoDB avec des caractères génériques dans les noms de champ.

Pour une conception de schéma alternative facile à interroger, je suggérerais une refonte de schéma qui suit ce modèle :

"_id" : ObjectId("55128d6315f3df650f2038cf"),
"customer_name" : "test user",
"createad" : "2011-04-14 16:44:09",
"data" : [ 
    {
        "key" : "123456",
        "home" : {
            "id" : "1536734296",
            "last" : "2011-04-14 16:44:09"
        },
        "work" : {
            "id" : "1536734296",
            "last" : "2011-04-14 16:44:09"
        }
    }, 
    {
        "key" : "321456",
        "home" : {
            "id" : "1536734296",
            "last" : "2011-04-14 16:44:09"
        },
        "work" : {
            "id" : "1536734296",
            "last" : "2011-04-14 16:44:09"
        }
    }, 
    {
        "key" : "789654",
        "home" : {
            "id" : "1536734296",
            "last" : "2011-04-14 16:44:09"
        },
        "work" : {
            "id" : "1536734296",
            "last" : "2011-04-14 16:44:09"
        }
    }
]

}

Que vous pouvez interroger comme suit

db.collection.find({ "data.work" : { $exists : true, $ne : null } })

pour vérifier l'existence du work champ dans les data tableau.