2015-05-22 3 views
4

У меня проблемы с запросом заполнителя мангуста.Mongoose aggregate возвращает пустой результат

Это своего рода вождение меня с ума, потому что я не могу найти решение нигде. Я был бы очень благодарен за любую поддержку.

Схема:

var EvalSchema = new Schema({ 
modified: {type: Date, default: Date.now}, 
created : {type: Date, default: Date.now}, 
username: {type: String, required: true}, 
item: {type: String, required: true}, 
criteria: [ 
    { 
     description: {type: String}, 
     eval: {type: Number} 
    } 
]});mongoose.model('Eval', EvalSchema); 

, и я использую агрегацию для вычисления суммы оценок по каждому критерию для данного элемента.

Eval.aggregate(
[ 
     { $match: { item: item.id}}, 
     { $unwind : "$criteria" }, 
     { 
      $group: { 
        _id: "$criteria.description", 
        total: { $sum: "$criteria.eval" }, 
        count: { $sum: 1 } 
       } 
     }, 
     {$project: {total:1, count:1, value: { $divide: [ "$total", "$count" ]}}} 
    ], function (err, result) { 
    if (err) { 
     console.log(err); 
    } 
     console.log(result); 
    }); 

Результат всегда пустой ....

Я фиксируя все запросы, которые Mongoose огня в приложении. Когда я запускаю запрос в Mongodb, он возвращает правильный результат.

coll.aggregate([ { '$match': { item: 'kkkkkkkkkkk' } }, { '$unwind': '$criteria' }, { '$group': { _id: '$criteria.description', total: { '$sum': '$criteria.eval' }, count: { '$sum': 1 } } }, { '$project':    { total: 1, count: 1, value: { '$divide': [ '$total', '$count' ] } } } ]) 

Результат:

{ 
    "result" : [ 
      { 
        "_id" : "Overall satisfaction", 
        "total" : 4, 
        "count" : 1, 
        "value" : 4 
      }, 
      { 
        "_id" : "service", 
        "total" : 3, 
        "count" : 1, 
        "value" : 3 
      }, 
      { 
        "_id" : "Quality", 
        "total" : 2, 
        "count" : 1, 
        "value" : 2 
      }, 
      { 
        "_id" : "Price", 
        "total" : 1, 
        "count" : 1, 
        "value" : 1 
      } 
    ], 
    "ok" : 1 
} 

модель ссылается на правильную коллекцию.

Спасибо :)

+1

Вы проверили значение, исходящее от 'item.id'? – chridam

+0

Да, да. Он содержит правильное значение. :( – yosrO

+0

Проверьте тип item.id. Может быть, это не строка. – ZeMoon

ответ

4

Ваш item.id в функции $match является String, поэтому вам нужно будет преобразовать его в ObjectID, например, так:

$match: { item: mongoose.Types.ObjectId(item.id) }

Вы можете обратиться к этой проблеме на GitHub aggregate для более подробной информации.

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