Mongodb选择JSON数组中所有JSON对象中存在键的文档

时间:2019-01-23 02:56:48

标签: json mongodb

我在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”。

1 个答案:

答案 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" : "" } ] }
>