sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB:Existencia de una clave anidada

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.