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



我正在使用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}}})

但这次它返回整个集合。我错过了什么?

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

最新更新