聚合组上的Mongoose错误

时间:2015-03-02 09:23:28

标签: node.js mongodb mongoose mongodb-query aggregation-framework

我有这个型号:

var Chat = new Schema({
    from: String,
    to: String,
    satopId: String,
    createdAt: Date
});
var Chat = mongoose.model('Chat', Chat);

我想做一个查询来执行一个查询,该查询返回在分组来自和从字段创建的最大值。我尝试过:

Chat.aggregate([
  {
    $group: {
      _id: '$to',
      from: '$from',
      createdAt: {
        $max: '$createdAt'
      }
    }
  },
  {
    $project: {
      _id: 1,
      createdAt: 1,
      from: 1,
      to: 1
    }
  }
], function(err, docs){

})

但这会产生此错误:

  

来自'的群组聚合字段'必须定义为表达式   在一个对象里面

我不明白这是什么意思。我该如何解决?

由于

1 个答案:

答案 0 :(得分:2)

任何"外面"如果$group语句中的_id表达式需要某种"grouping operator"

假设您对" sole"的想法感到满意。将键分组为"到"在您的文档中的字段,然后您可能需要$first

    Chat.aggregate([
        { "$group": { 
            "_id": "$to", 
            "from": { "$first": "$from" }, 
            "createdAt": { "$max": "$createdAt" } 
        }}, 
        function (err, docs) {
            // do something here
        }
    ])

否则,如果你想要" distinct" "两者的价值"然后它们都属于分组键的复合值:

    Chat.aggregate([
        { "$group": { 
            "_id": {
                "to": "$to", 
                "from": "$from"
            },
            "createdAt": { "$max": "$createdAt" } 
        }}, 
        function (err, docs) {
            // do something here
        }
    ])

基本上它是如何运作的。要么它是键的一部分,要么就像SQL一样需要分组操作符。

另请注意,$project断言并非真正需要,因为$group已经按照您的要求执行了此操作。