MongoDB聚合函数返回未定义

时间:2012-10-23 17:57:48

标签: mongodb

我正在尝试使用新的MongoDB聚合功能按日期计算一些统计信息。下面是我正在使用的文档示例,我尝试过的代码和所需的结果。聚合函数返回“UNDEFINED”。有人能告诉我为什么会这样吗?其次,我希望我的聚合函数按照mm-dd-yyyy格式按日期对结果进行分组。但是,由于目前已编写,我认为代码将按完整的ISO日期执行聚合。有人可以告诉我如何解决这个问题吗?

文件示例

{
  user: "2A8761E4-C13A-470E-A759-91432D61B6AF-25982-0000352D853511AF",
  language: "English",
  imageFileName: "F7A5ED9-D43C-4671-A5C6-F06C7E41F902-7758-000008371FB5B834",
  audioFileName: "F6D5727D-9377-4092-A28A-AA900F02653D-7758-0000083749066CF2",
  date: ISODate("2012-10-22T02:43:52Z"),
  correct: "1",
  _id: ObjectId("5084b2e8179c41cc15000001")
}

聚合功能

    var getUserStats = function(user, language, callback) {
    var guessCollection = db.collection('Guesses');
    guessCollection.aggregate(
  { $match: {
    user: user,
    language: language,
  }},
  { $sort: {
    date: 1
  }},
  { $project : {
     user : 1,
            language : 1,
            date : 1,
            correct : 1,
            incorrect : 1,
  } },
  { $unwind : "$language" },
  { $group : {
     _id : "$date",
            correct : { $sum : "$correct" },
            incorrect : { $sum : "$incorrect" }
  } }
, function(err, result){
    console.log(result);
    callback(result);
});

期望的结果

  {
        "result" : [
    //...snip...
            {
                "_id" : "2A8761E4-C13A-470E-A759-91432D61B6AF-25982-0000352D853511AF",
                "correct" : 32,
                "incorrect" : 17,
                "date" : 2012-10-22
            },
{
                "_id" : "2A8761E4-C13A-470E-A759-91432D61B6AF-25982-0000352D853511AF",
                "correct" : 16,
                "incorrect" : 7,
                "date" : 2012-10-23
            }
        ],
        "Ok" : 1
    }

1 个答案:

答案 0 :(得分:4)

关于它返回undefined的第一个问题,有两个问题:

  1. 您在不是数组的字段($unwind)上使用$language运算符。
  2. 您在字符串字段$sum)上使用$correct运算符;这只支持数字字段。
  3. 关于仅对日期进行分组的第二个问题,您需要预测要分组的日期组件,然后在$group运算符的_id值中使用这些组件:

    例如:

    test.aggregate(
        { $match: {
            user: user,
            language: language
        }},
        { $sort: {
            date: 1
        }},
        { $project : {
            user : 1,
            language : 1,
            year : { $year: '$date' },
            month : { $month: '$date' },
            day : { $dayOfMonth: '$date'},
            correct : 1,
            incorrect : 1
        }},
        { $group : {
            _id : { year: "$year", month: "$month", day: "$day" },
            correct : { $sum : "$correct" },
            incorrect : { $sum : "$incorrect" }
        }},
        function(err, result){
            console.log(result);
        }
    );
    

    产生输出:

    [ { _id: { year: 2012, month: 10, day: 22 },
        correct: 0,
        incorrect: 0 } ]
    

    您可以将代码汇总到'2012-10-22'代码中。