Dengan versi MongoDb>=3.6 Anda dapat memanfaatkan operator $expr
dalam kueri Anda dan gunakan $objectToArray
operator untuk mengonversi objek dinamis menjadi larik, filter larik untuk bidang nilai kerja menggunakan $ifNull
sebagai operator bersyarat.
Contoh berikut menunjukkan pendekatan ini:
db.collection.find({
$expr: {
$gt: [
{
$size: {
$filter: {
input: { $objectToArray: '$$ROOT' },
cond: {
$ifNull: ['$$this.v.work', false]
}
}
}
},
0
]
}
})
Memiliki nilai sebagai kunci bukanlah praktik yang baik dan saat ini (dan mungkin juga di masa mendatang) tidak mungkin menanyakan koleksi MongoDB dengan karakter pengganti di nama bidang.
Untuk desain skema alternatif yang mudah ditanyakan, saya akan menyarankan desain ulang skema yang mengikuti model ini:
"_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"
}
}
]
}
Yang dapat Anda tanyakan sebagai berikut
db.collection.find({ "data.work" : { $exists : true, $ne : null } })
untuk memeriksa keberadaan work
bidang di data
larik.