最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

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

运维笔记admin13浏览0评论

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

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

我有这样的数据结构:

{
    "_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);

任何帮助都非常感谢

回答如下:

在使用$unwind计数之前你可以assets $group:

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

评论列表(0)

  1. 暂无评论