Z MongoDb w wersji>=3.6 możesz wykorzystać operator $expr
w zapytaniu i użyj $objectToArray
operator do konwersji obiektu dynamicznego na tablicę, filtruj tablicę dla pola wartości pracy za pomocą $ifNull
jako operator warunkowy.
Poniższy przykład ilustruje to podejście:
db.collection.find({
$expr: {
$gt: [
{
$size: {
$filter: {
input: { $objectToArray: '$$ROOT' },
cond: {
$ifNull: ['$$this.v.work', false]
}
}
}
},
0
]
}
})
Nie jest dobrą praktyką posiadanie wartości jako kluczy i obecnie (i prawdopodobnie także w przyszłości) nie jest możliwe odpytywanie kolekcji MongoDB za pomocą symboli wieloznacznych w nazwach pól.
W przypadku alternatywnego projektu schematu łatwego do zapytania, sugerowałbym przeprojektowanie schematu zgodnie z następującym modelem:
"_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"
}
}
]
}
Które możesz zapytać w następujący sposób
db.collection.find({ "data.work" : { $exists : true, $ne : null } })
aby sprawdzić istnienie work
pole w data
tablica.