MongoDB在聚合上使用两个展开来获取重复计数的值

时间:2018-10-24 08:25:46

标签: mongodb aggregation

我有一个像这样的数据集:

{
    "_id" : ObjectId("5bacc9295af10e2764648baa"),
    "slug" : ["Maruti", "Honda"],
    "page" : "Ford"
},
{
    "_id" : ObjectId("5bacc9295af10e2764648bab"),
    "slug" : ["Maruti", "Honda", "Tata"],
    "page" : "Hyundai"
},
{
    "_id" : ObjectId("5bacc9295af10e2764648bac"),
    "slug" : ["Maruti"],
    "page" : "Ford"
},
{
    "_id" : ObjectId("5bacc9295af10e2764648bad"),
    "slug" : ["Ford", "Hyundai"],
    "page" : "Tata"
}

现在,如果我想获取Page的重复计数,那么我将像这样进行汇总查询:

MyCollectionName.aggregate([
      { $unwind: { path: "$page" } },
      { $group: { _id: "$page", count: { $sum: 1 } } },
      {
        $project: {
          _id: 0,
          vehiclename: "$_id",
          count: { $multiply: ["$count", 1] }
        }
      },
      { $sort: { count: -1 } }
    ])
    .then(data => {
         console.log(data)
         //get the result like this which is fine
         [
           { vehiclename : 'Ford', count: 2},
           { vehiclename : 'Hyundai', count: 1},
           { vehiclename : 'Tata', count: 1}
         ]
     })
     .catch(e => {
       console.log(e)
      })

类似地,如果我对Slug进行查询,那么我的查询将如下所示:

MyCollectionName.aggregate([
      { $unwind: { path: "$slug" } },
      { $group: { _id: "$slug", count: { $sum: 1 } } },
      {
        $project: {
          _id: 0,
          vehiclename: "$_id",
          count: { $multiply: ["$count", 1] }
        }
      },
      { $sort: { count: -1 } }
    ])
    .then(data => {
         console.log(data)
         //get the result like this which is fine
         [
           { vehiclename : 'Maruti', count: 3},
           { vehiclename : 'Honda', count: 2},
           { vehiclename : 'Tata', count: 1},
           { vehiclename : 'Ford', count: 1},
           { vehiclename : 'Hyundai', count: 1}
         ]
     })
     .catch(e => {
       console.log(e)
      })

现在我要在单个查询而不是单独查询上执行此操作。

我对使用unwind和在单个查询中获得两个组合值后感到困惑。

所需的输出将如下所示:

[
 { vehiclename : 'Maruti', count: 3},
 { vehiclename : 'Ford', count: 3},
 { vehiclename : 'Honda', count: 2},
 { vehiclename : 'Tata', count: 2},        
 { vehiclename : 'Hyundai', count: 1}
]

真的很感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。如果我做错了,请通知。.

MyCollectionName.aggregate([
      {
        $facet: {
          groupByPage: [
            { $unwind: "$page" },
            {
              $group: {
                _id: "$page",
                count: { $sum: 1 }
              }
            }
          ],
          groupBySlug: [
            { $unwind: "$slug" },
            {
              $group: {
                _id: "$slug",
                count: { $sum: 1 }
              }
            }
          ]
        }
      },
      {
        $project: {
          pages: {
            $concatArrays: ["$groupByPage", "$groupBySlug"]
          }
        }
      },
      { $unwind: "$pages" },
      {
        $group: {
          _id: "$pages._id",
          count: { $sum: "$pages.count" }
        }
      },
      { $sort: { count: -1 } }
    ])
    .then(data => {
         console.log(data)             
     })
     .catch(e => {
       console.log(e)
      })