Med MongoDb version>=3.6 kan du udnytte operatøren
kode>$udtr
i din forespørgsel og brug $objectToArray
operatør for at konvertere det dynamiske objekt til et array, filtrer arrayet for arbejdsværdifeltet ved hjælp af $ifNull
som den betingede operatør.
Følgende eksempel viser denne tilgang:
db.collection.find({
$expr: {
$gt: [
{
$size: {
$filter: {
input: { $objectToArray: '$$ROOT' },
cond: {
$ifNull: ['$$this.v.work', false]
}
}
}
},
0
]
}
})
Det er ikke god praksis at have værdier som nøgler, og i øjeblikket (og sandsynligvis også i fremtiden) er det ikke muligt at forespørge MongoDB-samlinger med jokertegn i feltnavne.
For et alternativt skemadesign, der er nemt at forespørge på, vil jeg foreslå et skema-redesign, der følger denne model:
"_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"
}
}
]
}
Hvilket du kan forespørge på som følger
db.collection.find({ "data.work" : { $exists : true, $ne : null } })
for at kontrollere eksistensen af værket
feltet i data
array.