我在MongoDB中的文档具有以下JSON结构。如何编写查询以选择具有JSON数组“ test” 且数组不为空的文档,并且该数组中的所有JSON对象均具有键“ attr3”。
{
"id": "123456",
"test": [
{
"att1": 4,
"att2": "fffff",
"att3": 46
},
{
"att1": 8,
"att2": "ggggg",
"att3": 6
},
{
"att1": 3,
"att2": "hhhh",
"att3": 4
},
{
"att1": 4,
"att2": "llll",
}
]
}
不能检索上述文档,因为它具有JSON数组“ test”,但最后一个对象没有“ attr3”。
答案 0 :(得分:1)
您可以检查$size
数组的test
和$size
数组的test.att3
,如果两者相同,则所有数组元素都包含属性att3
< / p>
{$expr:
{$and:[
"$test", //exists
{$gt: [{$size: "$test"},0]}, //non empty
{$eq:[{$size: "$test"},{$size: "$test.att3"}]} //att3 present in all
]}
}
收藏
> db.t66.find()
{ "_id" : ObjectId("5c47df42efd14747b5de90f8"), "test" : [ { "att3" : "sda" }, { "att3" : "gsfe" }, { }, { "att3" : "" } ] }
{ "_id" : ObjectId("5c47dfbfefd14747b5de90f9"), "test" : [ { "att3" : "sda" }, { "att3" : "gsfe" }, { "att3" : "fewfw" }, { "att3" : "" } ] }
{ "_id" : ObjectId("5c47e0fbefd14747b5de90fa") }
找到
> db.t66.find({$expr : {$and: [{$gt : [{$size : {$ifNull : ["$test", []]}},0]},{$eq:[{$size : "$test"},{$size : "$test.att3"}]}]}})
{ "_id" : ObjectId("5c47dfbfefd14747b5de90f9"), "test" : [ { "att3" : "sda" }, { "att3" : "gsfe" }, { "att3" : "fewfw" }, { "att3" : "" } ] }
汇总
> db.t66.aggregate([{$match : {$expr : {$and: [{$gt : [{$size : {$ifNull : ["$test", []]}},0]},{$eq:[{$size : "$test"},{$size : "$test.att3"}]}]}}}])
{ "_id" : ObjectId("5c47dfbfefd14747b5de90f9"), "test" : [ { "att3" : "sda" }, { "att3" : "gsfe" }, { "att3" : "fewfw" }, { "att3" : "" } ] }
>