Với phiên bản MongoDb> =3.6, bạn có thể tận dụng toán tử $expr
trong truy vấn của bạn và sử dụng $objectToArray
toán tử để chuyển đổi đối tượng động thành một mảng, lọc mảng cho trường giá trị công việc bằng cách sử dụng $ifNull
là toán tử điều kiện.
Ví dụ sau minh họa cách tiếp cận này:
db.collection.find({
$expr: {
$gt: [
{
$size: {
$filter: {
input: { $objectToArray: '$$ROOT' },
cond: {
$ifNull: ['$$this.v.work', false]
}
}
}
},
0
]
}
})
Không phải là phương pháp hay để có các giá trị làm khóa và hiện tại (và có thể cả trong tương lai) không thể truy vấn bộ sưu tập MongoDB bằng các ký tự đại diện trong tên trường.
Để có một thiết kế giản đồ thay thế dễ truy vấn, tôi sẽ đề xuất một thiết kế lại giản đồ tuân theo mô hình này:
"_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"
}
}
]
}
Bạn có thể truy vấn như sau
db.collection.find({ "data.work" : { $exists : true, $ne : null } })
để kiểm tra sự tồn tại của work
trong data
mảng.