sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB:Förekomsten av en kapslad nyckel

Med MongoDb version>=3.6 kan du utnyttja operatören $expr i din fråga och använd $objectToArray operatorn för att konvertera det dynamiska objektet till en array, filtrera arrayen för arbetsvärdesfältet med $ifNull som villkorsoperatör.

Följande exempel visar detta tillvägagångssätt:

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

Det är inte bra att ha värden som nycklar och för närvarande (och förmodligen även i framtiden) är det inte möjligt att fråga MongoDB-samlingar med jokertecken i fältnamn.

För en alternativ schemadesign som är lätt att fråga, skulle jag föreslå en omdesign av schemat som följer denna modell:

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

}

Vilket du kan fråga enligt följande

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

för att kontrollera om arbetet finns fältet i data array.



  1. Datatypkonvertering i MongoDB

  2. Hitta alla dubbletter av dokument i en MongoDB-samling genom ett nyckelfält

  3. Mongoose Model Custom-felmeddelande för Enums

  4. Hur kan jag göra en fråga med mongoose från en funktion med hjälp av en parameter?