Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js MongoDB:聚合,按多个字段分组_Node.js_Mongodb_Aggregation Framework - Fatal编程技术网

Node.js MongoDB:聚合,按多个字段分组

Node.js MongoDB:聚合,按多个字段分组,node.js,mongodb,aggregation-framework,Node.js,Mongodb,Aggregation Framework,我收集了一些文件,就是那种结构 { type: 'a', date: '2014-01-04' }, { type: 'b', date: '2014-01-04' }, { type: 'b', date: '2014-01-04 }, { type: 'c', date: '2014-01-03' }, { type: 'a', date: '2014-01-03' } 我想按日期和类型聚合数据(按日期分组和按类型计数): 我有聚合函数,像这样 db

我收集了一些文件,就是那种结构

{
  type: 'a',
  date: '2014-01-04'
},
{
  type: 'b',
  date: '2014-01-04'
},
{
  type: 'b',
  date: '2014-01-04
},
{
  type: 'c',
  date: '2014-01-03'
},
{
  type: 'a',
  date: '2014-01-03'
}
我想按日期和类型聚合数据(按日期分组和按类型计数):

我有聚合函数,像这样

db.items.aggregate([
    {
        $match: { user: user },
    },
    {
        $group: { _id: {date: '$date'}, count: {$sum: 1}, services: {$push: '$type'}}
    }
], function (err, results) {
但要做到这一点,我仍然需要减少服务的结果


这可以通过一个聚合查询完成吗?

假设您有固定数量的类型,您可以按如下方式解决它:

db.collection.aggregate(
{$group : {_id : "$date", 
           a:{$sum:{$cond:[{$eq:['$type','a']},1,0]}},
           b:{$sum:{$cond:[{$eq:['$type','b']},1,0]}},
           c:{$sum:{$cond:[{$eq:['$type','c']},1,0]}}
}},
{$project : {_id : 0, date : "$_id", a: "$a", b : "$b", c : "$c"}}
)

通过假设您有固定数量的类型,您可以按如下方式解决它:

db.collection.aggregate(
{$group : {_id : "$date", 
           a:{$sum:{$cond:[{$eq:['$type','a']},1,0]}},
           b:{$sum:{$cond:[{$eq:['$type','b']},1,0]}},
           c:{$sum:{$cond:[{$eq:['$type','c']},1,0]}}
}},
{$project : {_id : 0, date : "$_id", a: "$a", b : "$b", c : "$c"}}
)

当然,您可以按多个字段分组:

{ $group: { _id: { date: '$date', services: '$services' } }
但这似乎不是你想要的。您无法轻松地将数据转换为键,除非您可以手动完成。以下查询将是一个选项:

db.test.aggregate( [
    { $group: {
        '_id' : { date: '$date' },
        a: { $sum: { 
            $cond: [ { $eq: [ '$type', 'a' ] }, 1, 0 ]  
        } },
        b: { $sum: { 
            $cond: [ { $eq: [ '$type', 'b' ] }, 1, 0 ]
        } },
        c: { $sum: { 
            $cond: [ { $eq: [ '$type', 'c' ] }, 1, 0 ] 
        } },
    } },
    { $project: {
        _id: 0,
        date: '$_id.date',
        a: '$a',
        b: '$b',
        c: '$c',
    } }
] );

您需要为每个新类型手动添加一行。

您当然可以按多个字段分组:

{ $group: { _id: { date: '$date', services: '$services' } }
但这似乎不是你想要的。您无法轻松地将数据转换为键,除非您可以手动完成。以下查询将是一个选项:

db.test.aggregate( [
    { $group: {
        '_id' : { date: '$date' },
        a: { $sum: { 
            $cond: [ { $eq: [ '$type', 'a' ] }, 1, 0 ]  
        } },
        b: { $sum: { 
            $cond: [ { $eq: [ '$type', 'b' ] }, 1, 0 ]
        } },
        c: { $sum: { 
            $cond: [ { $eq: [ '$type', 'c' ] }, 1, 0 ] 
        } },
    } },
    { $project: {
        _id: 0,
        date: '$_id.date',
        a: '$a',
        b: '$b',
        c: '$c',
    } }
] );

您需要为每个新类型手动添加一行。

这是不正确的。“$\u id.a”、“$\u id.b”和“$\u id.c”不会返回任何结果。在group part中,id对象不包含a、b、c字段。是的,我有固定数量的类型-因此您的查询看起来很有趣。我不知道$project可以跟踪$group。我会尽快尝试。这是不正确的。“$\u id.a”、“$\u id.b”和“$\u id.c”不会返回任何结果。在group part中,id对象不包含a、b、c字段。是的,我有固定数量的类型-因此您的查询看起来很有趣。我不知道$project可以跟踪$group。我会尽快尝试。在我看来,这与@Derick的答案非常接近。假设他的答案是经过编辑的1.你可以查一下答案的时间。我以前的回答比德里克还多。在我看来,这与@Derick的回答非常接近。假设他的答案是经过编辑的1.你可以查一下答案的时间。我比德里克早回答过。