mongodb - Mongodb 聚合不工作

标签 mongodb aggregation-framework

我在 mongo 集合 (datacollection) 中有以下数据:

{
  "_id": ObjectId("54980efef7db7d9b018d375b"),
  "sub_id": "1234567890",
  "points": "10",
  "oid": "1",
  "name": "test",
  "app": "e53abc6d12fea63c80e4c2e1d49e",
  "source": "mysource",
  "product_name": "browser",
  "added": ISODate("2014-12-22T12:30:54.618Z"),
  "added_human": "2014-12-22 06:30:54",
  "checked": true
}

我实际上需要找出按日期分组的点数总和。 SQL 查询将如下所示: SELECT DATE(added) as point_date, SUM(points) AS total_points FROM mytable WHERE added between 'from' AND 'to' GROUP BY DATE(added).

所以我正在使用以下聚合:

db.datacollection.aggregate(
    { 
        $match:{
            "added" : {$gte:ISODate("2014-12-01"), $lt:ISODate("2014-12-25")},   
            "source":"mysource"  
        },   
        $group : {
            "_id" : { month: { $month: "$added" }, day: { $dayOfMonth: "$added" }, year: { $year: "$added" } },
            "total_points":{$sum:"$points"}   
        }  
    }  
);

但是这是显示

"errmsg" : "exception: A pipeline stage specification object must contain exactly one field.",

如何解决这个问题,或者是否有更好的方法来进行此计算??

最佳答案

使用这个:

db.datacollection.aggregate(
    { 
        $match:{
            "added" : {$gte:ISODate("2014-12-01"), $lt:ISODate("2014-12-25")},   
            "source":"mysource"  
        }
    },   
    {   $group : {
            "_id" : { month: { $month: "$added" }, day: { $dayOfMonth: "$added" }, year: { $year: "$added" } },
            "total_points":{$sum:"$points"}   
        }  
    }  
);

您应该使用这种格式({} 对中的每个管道)

db.collection.aggrgation ( 
   { $group: ....},
   { $match : .... },
   ...
})

但你用过:

db.collection.aggrgation ( 
   { $group: ....,
     $match : ....,
     ...
   }
})

关于mongodb - Mongodb 聚合不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27656102/

相关文章:

mongodb - 如何使用 Mongodb 在数组和对象中设置差异

javascript - MongoDB聚合: Replacing an array of IDs with the corresponding objects from an array in the same document

mongodb - 在蒙戈获得一个月的第一天。将 'yyyy-mm-dd-hh-mm-ss.SSS' 转换为 'yyyy-mm-01-00-00-00.000' 的时间戳

node.js - Mongoose:添加新的 Schema 属性并更新所有当前文档

node.js - 是否可以打包一个 'real' mongodb 库以仅在 meteor 0.6 中用于 *server* 端

node.js - 使用 mongoose 在 mongodb 上执行 mapreduce 时不能在 reduce 函数中使用 underscore.js

javascript - MongoDB - 使用聚合管道进行评论赞成/反对

node.js - 如何使用 Mongoose 时间戳日期进行查询

node.js - MongoServerError:聚合期间的 PlanExecutor 错误::由::'newRoot' 表达式引起,表达式必须计算为对象

regex - 在 mongodb 聚合中的 $expr 中使用 $regex