Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按内部数组的特定元素分组_Python_Python 3.x_Mongodb_Group By_Mongodb Query - Fatal编程技术网

Python 按内部数组的特定元素分组

Python 按内部数组的特定元素分组,python,python-3.x,mongodb,group-by,mongodb-query,Python,Python 3.x,Mongodb,Group By,Mongodb Query,我正试图通过一次查询获得以下结果: 获取pub.type为deb、pub.name为Mzn的所有结果,并按pub.name对其进行分组,其中pub.type为cred 以下是示例数据: [ { "addr": "address1", "book": "book1", "pub": [ { "type": "deb", "name": "Mzn" }, { "type": "cred",

我正试图通过一次查询获得以下结果:

获取pub.type为deb、pub.name为Mzn的所有结果,并按pub.name对其进行分组,其中pub.type为cred

以下是示例数据:

[
  {
    "addr": "address1",
    "book": "book1",
    "pub": [
      {
        "type": "deb",
        "name": "Mzn"
      },
      {
        "type": "cred",
        "name": "Alf"
      }
    ]
  },
  {
    "addr": "address1",
    "book": "book1",
    "pub": [
      {
        "type": "deb",
        "name": "Mzn"
      },
      {
        "type": "cred",
        "name": "Alf"
      }
    ]
  },
  {
    "addr": "address1",
    "book": "book1",
    "pub": [
      {
        "type": "deb",
        "name": "Mzn"
      },
      {
        "type": "cred",
        "name": "All"
      }
    ]
  },
  {
    "addr": "address1",
    "book": "book1",
    "pub": [
      {
        "type": "deb",
        "name": "Mzn"
      },
      {
        "type": "cred",
        "name": "All"
      }
    ]
  },
  {
    "addr": "address1",
    "book": "book1",
    "pub": [
      {
        "type": "deb",
        "name": "Mzn"
      },
      {
        "type": "cred",
        "name": "All"
      }
    ]
  },
  {
    "addr": "address1",
    "book": "book1",
    "pub": [
      {
        "type": "deb",
        "name": "Mzn"
      },
      {
        "type": "cred",
        "name": "Hab"
      }
    ]
  },
  {
    "addr": "address1",
    "book": "book1",
    "pub": [
      {
        "type": "deb",
        "name": "Hab"
      },
      {
        "type": "cred",
        "name": "Alf"
      }
    ]
  },
  {
    "addr": "address1",
    "book": "book1",
    "pub": [
      {
        "type": "deb",
        "name": "Hab"
      },
      {
        "type": "cred",
        "name": "Alf"
      }
    ]
  },
  {
    "addr": "address1",
    "book": "book1",
    "pub": [
      {
        "type": "deb",
        "name": "All"
      },
      {
        "type": "cred",
        "name": "Alf"
      }
    ]
  },
  {
    "addr": "address1",
    "book": "book1",
    "pub": [
      {
        "type": "deb",
        "name": "Mzn"
      },
      {
        "type": "cred",
        "name": "Hab"
      }
    ]
  }
]
到目前为止,我已经回答了下面的问题。第一部分在
$match
块内工作正常,第二部分则不正常。它是按数组对数据进行分组,但我希望它按数组对象的元素对数据进行分组,在数组对象中它应该满足特定条件(我前面已经写过)

我曾尝试使用
$unwind
,但它只是将其拆分为数组中每个元素的对象

这是上述查询生成的结果:

这就是我需要的结果:


非常感谢您的帮助。

下面的内容似乎是获得答案的一种迂回方式,但这对我很有用

解卷
pub1
可能会在大型数据集中出现问题

db.getCollection('books').aggregate(  [ 
   { 
      "$match":{ 
         "pub":{ 
            $elemMatch:{ 
               "type":"deb",
               "name":"Mzn"
            }
         }
      }
   },
   { 
      "$project":{ 
         "_id":"$_id",
         "addr":"$addr",
         "book":"$book",
         "pub":"$pub",
         "pub1":"$pub"
      }
   },
   { 
      "$unwind":'$pub1'
   },
   { 
      "$match":{ 
         "pub1.type":"cred"
      }
   },
   { 
      "$group":{ 
         "_id":{ 
            "name":"$pub1.name"
         },
         "object":{ 
            "$push":{ 
               "_id":"$$ROOT._id",
               "addr":"$$ROOT.addr",
               "book":"$$ROOT.book",
               "pub":"$$ROOT.pub"
            }
         }
      }
   }
])
“所需结果”中的json数据是您需要的最终输出,还是“按pub.name将它们分组,其中pub.type是cred”?
db.getCollection('books').aggregate(  [ 
   { 
      "$match":{ 
         "pub":{ 
            $elemMatch:{ 
               "type":"deb",
               "name":"Mzn"
            }
         }
      }
   },
   { 
      "$project":{ 
         "_id":"$_id",
         "addr":"$addr",
         "book":"$book",
         "pub":"$pub",
         "pub1":"$pub"
      }
   },
   { 
      "$unwind":'$pub1'
   },
   { 
      "$match":{ 
         "pub1.type":"cred"
      }
   },
   { 
      "$group":{ 
         "_id":{ 
            "name":"$pub1.name"
         },
         "object":{ 
            "$push":{ 
               "_id":"$$ROOT._id",
               "addr":"$$ROOT.addr",
               "book":"$$ROOT.book",
               "pub":"$$ROOT.pub"
            }
         }
      }
   }
])