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.