python - 按内部数组的特定元素分组

标签 python python-3.x mongodb group-by mongodb-query

我试图通过单个查询实现如下所述的结果:

Get all results where pub.type is deb and pub.name is Mzn and group them by pub.name where pub.type is 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 block 内工作正常,第二部分则不然。它按数组对数据进行分组,但我希望它按数组对象的元素对数据进行分组,其中它应该满足特定条件(我之前已经写过)。

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

这是我需要的结果:desired result

非常感谢任何帮助。

最佳答案

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

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

关于python - 按内部数组的特定元素分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59028654/

相关文章:

python - 通过conda安装特定版本的spyder

python - 如何在没有管理员权限的情况下激活 Python 虚拟环境?

python - 产量(x)与(产量(x)): parentheses around yield in python

c# - 如何在Python中将字节数组反序列化/序列化为结构体?

python - Keras 中的特征提取

python - 一般来说,遍历未知数量列表的最佳方法是什么?

python - 将 "Bokeh created html file"嵌入到 Flask "template.html"文件中

javascript - 在第二次保存操作中未调用子文档的 Mongoose 预保存中间件

java - 用于在java桌面应用程序中存储字符串的本地数据库,当前使用MongoDB

php - 无法使用 php7 和 symfony 3 加载 mongodb fixtures