Con MongoDb versión>=3.6 puede aprovechar el operador $expr
en su consulta y use el $objectToArray
operador para convertir el objeto dinámico en una matriz, filtre la matriz para el campo de valor de trabajo usando $ifNull
como operador condicional.
El siguiente ejemplo demuestra este enfoque:
db.collection.find({
$expr: {
$gt: [
{
$size: {
$filter: {
input: { $objectToArray: '$$ROOT' },
cond: {
$ifNull: ['$$this.v.work', false]
}
}
}
},
0
]
}
})
No es una buena práctica tener valores como claves y actualmente (y probablemente en el futuro también) no es posible consultar las colecciones de MongoDB con comodines en los nombres de campo.
Para un diseño de esquema alternativo fácil de consultar, sugeriría un rediseño de esquema que siga este modelo:
"_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 puede consultar de la siguiente manera
db.collection.find({ "data.work" : { $exists : true, $ne : null } })
para comprobar la existencia de la work
campo en los data
matriz.