繁体   English   中英

如何获取mongodb聚合上所有条目的对象数组的值重复计数

[英]How to get the value repetition count on array of objects for all entries on mongodb aggregation

我有这样的数据结构:

{
    "_id" : ObjectId("5c4404906736bd2608e30b5e"),
    "assets": [ 
        {
            "name" : "xa",
            "id"   : 1
        },
        {
            "name" : "xs",
            "id"   : 2
        }
    ]
},
{
    "_id" : ObjectId("5c4404906736bd2608e30b5f"),
    "assets": [ 
        {
            "name" : "xa",
            "id"   : 3
        }
    ]
},
{
    "_id" : ObjectId("5c4404906736bd2608e30b5g"),
    "assets": [ 
        {
            "name" : "xa",
            "id"   : 4
        },
        {
            "name" : "xd",
            "id"   : 5
        },
        {
            "name" : "xs",
            "id"   : 6
        }
    ]
}

现在我想实现 MongoDB 聚合,通过它我得到了这样的答案:

[
 {
  "assets": "xa",
  "count": 3
 },
 {
  "assets": "xs",
  "count": 2
 },
 {
  "assets": "xd",
  "count": 1
 },
]

我必须通过 javascript 完成这项工作,但需要在聚合上实现这一点。 我使用 js 实现的代码对于一组对象数组是这样的,即

var arr = [
  { asset: "xa" },
  { asset: "xs" },
  { asset: "xa" },
  { asset: "xs" },
  { asset: "xa" },
  { asset: "xd" }
];

var userDict = arr.reduce((acc, el) => {
  if (!acc.hasOwnProperty(el.asset)) {
    acc[el.asset] = { count: 0 };
  }
  acc[el.asset].count++;
  return acc;
}, {});

var result = Object.entries(userDict).map(([k, v]) => ({
  asset: k,
  count: v.count
}));
console.log(result);

任何帮助真的很感激

您可以在使用计数应用$group之前$unwind assets

db.col.aggregate([
    {
        $unwind: "$assets"
    },
    {
        $group: {
            _id: "$assets.name",
            count: { $sum: 1 }
        }
    },
    {
        $project: {
            _id: 0,
            asset: "$_id",
            count: 1
        }
    }
])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM