2

у меня есть эта модель:Mongoose ошибка совокупной группы

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){ 

}) 

Но это порождает эту ошибку:

the group aggregate field 'from' must be defined as an expression inside an object

Я не понимаю, что это значит. Как я могу это решить?

Благодаря

ответ

2

Все «вне», если _id выражения в $group заявления требует "grouping operator" какого-то.

Предполагая, что вы счастливы с идеей «единственной» группировки ключа, чтобы быть «в» поле в документах, то вы, вероятно, хотите что-то вроде $first:

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

В противном случае, если вы хотите «отчетливый» значения на «обоих» полях, то они оба входят в составное значение ключа группировки:

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

Это в основном, как это работает. Либо это часть ключа, либо что-то, что требует оператора группировки, как с SQL.

Также обратите внимание, что ваше утверждение $project не требуется, так как $group уже делает то, что вы просите.

Смежные вопросы