如何在mongodb的python pymongo 3.7.2中过滤嵌套数组

时间:2019-06-07 18:11:58

标签: python mongodb pymongo

我将pymongo版本3.7.2与python 3.6.8一起使用。我的数据库中有以下格式的文档:

{"_id" : 1,
"main_array":[
{"subid":222,
"subarray":[{"name":"hari","status":1},{"name":"henry","status":1}]
},
{"subid":333,
"subarray":[{"name":"james","status":0},{"name":"jason","status":1}]
}]
},
{"_id" : 2,
"main_array":[
{"subid":222,
"subarray":[{"name":"alex","status":1},{"name":"anna","status":1}]
},
{"subid":333,
"subarray":[{"name":"bob","status":0},{"name":"bunny","status":1}]
}]
}

我需要从集合中的所有文档中获取subid = 222的对象。所需结果应如下:

{"_id" : 1,
"main_array":[
{"subid":222,
"subarray":[{"name":"hari","status":1},{"name":"henry","status":1}]
}]
},
{"_id" : 2,
"main_array":[
{"subid":222,
"subarray":[{"name":"alex","status":1},{"name":"anna","status":1}]
}]

}

我尝试了以下代码:

myclient = pymongo.MongoClient(<mongoclient url>)
mydb = myclient["test"]
mycol = mydb["user"]  
subid = 222
_id = 1
x = mycol.find({"_id":_id},{"main_array":{"$elemMatch":{"subid":subid}}})

我得到了特定文档所需的结果。但是我需要所有文件。我尝试了以下查询:

x = mycol.find({"main_array":{"$elemMatch":{"subid":subid}}})

但是这次它将返回整个集合。我想念什么?

1 个答案:

答案 0 :(得分:0)

elemMatch为您提供文档,其中任何数组项都通过该条件。

您应将聚合管道与$unwind$match一起使用。

基本上,做:

db.collection.aggregate([{
  $unwind: "$main_array"
},
{
  $match: {
    "main_array.subid": 222
  }
}])

这虽然将main_array作为对象,但是您应该可以使用它。

以上内容的输出

[
  {
    "_id": 1,
    "main_array": {
      "subarray": [
        {
          "name": "hari",
          "status": 1
        },
        {
          "name": "henry",
          "status": 1
        }
      ],
      "subid": 222
    }
  },
  {
    "_id": 2,
    "main_array": {
      "subarray": [
        {
          "name": "alex",
          "status": 1
        },
        {
          "name": "anna",
          "status": 1
        }
      ],
      "subid": 222
    }
  }
]

提琴:https://mongoplayground.net/p/-sg_d2h5wIJ