首页 > 解决方案 > 按内部数组的特定元素分组

问题描述

我正在尝试通过单个查询来实现如下所述的结果:

获取pub.typedebpub.nameMzn的所有结果,并按pub.name将它们分组,其中pub.typecred

这是示例数据:

[
  {
    "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块内工作正常,第二部分不是。它是按数组对数据进行分组,但我希望它按数组对象的元素对数据进行分组,它应该满足特定条件(我之前已经写过)。

db.collection.aggregate( 
[ 
  { 
     "$match":{ 
        "pub":{ 
           $elemMatch:{ 
              "type":"deb",    //This part is working fine
              "name":"Mzn"
           }
        }
     }
  },
  { 
     "$group":{ 
        "_id":{ 
           "object":"$pub.name"
        },
        "object":{ 
           "$push":"$$ROOT"
        }
     }
  }
])

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

这是上面查询生成的结果:result by above query

这是我需要的结果:期望的结果

非常感谢任何帮助。

标签: pythonpython-3.xmongodbgroup-bymongodb-query

解决方案


以下似乎是获得答案的迂回方式,但这对我有用。

展开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"
            }
         }
      }
   }
])

推荐阅读