最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

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

IT培训 admin 8浏览 0评论

如何获取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
        }
    }
])

如何获取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. 暂无评论