【问题标题】:How to filter nested array in python pymongo 3.7.2 for mongodb如何在 python pymongo 3.7.2 中为 mongodb 过滤嵌套数组
【发布时间】:2019-10-23 06:13:51
【问题描述】:

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

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

【问题讨论】:

    标签: python mongodb pymongo


    【解决方案1】:

    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

    【讨论】:

    • 成功了。我不得不像这样使用管道:[{ "$unwind": "$main_array" }, { "$match": { "main_array.subid": 222 } } ]将它包含在方括号中
    猜你喜欢
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 2023-02-19
    • 1970-01-01
    • 2020-12-24
    相关资源
    最近更新 更多