2015-08-05 5 views
1

Использование MongoDB в Meteor JS, как вы правильно используете Meteor Aggregate?MongoDB Aggregate & Grouping Issue in MeteorJS

Целью является возвращение сгруппированных пользователей по их идентификатору пользователя и суммирование булевского поля, называемого «progressState» (true/false).

Например, документ может иметь:

user 001 - true 
user 001 - false 
user 001 - true 
user 003 - false 
user 005 - true 

но предполагаемый результат будет:

user 001: 2 true 
user 003: 0 true 
user 005: 1 true 
etc.. 

Моя попытка дает следующее сообщение об ошибке:

"exception: FieldPath field names may not start with '$'." 

Вот мой Метеор Код:

Meteor.publishComposite('completedLB', { 
    find: function() { 
     return userCompleted.aggregate([ 
      { 
       $match: { 
        "progressState": "true" 
       } 
      }, 
      { 
       $group: { 
        "_id": "$userId", 
        "count": { 
         "$sum": "$progressState" 
        } 
       } 
      }, 
      { 
       $sort : { 
        "$progressState": -1 
       } 
      } 
     ]); 
    } 
}); 

ответ

2

Если вы используете meteor hacks aggregate пакет для реализации .aggregate() команды на вашей коллекции, то это будет только возвращать массив в ответ. Таким образом, вы должны работать, что в виде опубликованной коллекции:

Meteor.publish("completedLB,function() { 
    var self = this; 

    var results = userCompleted.aggregate([ 
     { "$match": { "progressState": true } }, 
     { "$group": { 
      "_id": "$userId", 
      "progressState": { "$first": "$progressState" }, 
      "count": { "$sum": 1 } 
     }}, 
     { "$sort": { "_id": 1 } } 
    ]); 

    _.each(results,function(result) { 
     self.added("client_collection_name",Random.id(), { 
      userId: result._id, 
      progressState: result.progressState, 
      count: result.count 
     }); 
    }); 
    self.ready(); 
}); 

Или включить в false, считается, что ваше Рекомендованное выход напрашивается сами собой:

 { "$group": { 
      "_id": "$userId", 
      "progressState": { "$first": true }, 
      "count": { "$sum": { "$cond": ["$progressState", 1,0] } 
     }}, 
     { "$sort": { "_id": 1 } } 

В трубопроводе с $cond оценкой для преобразования к числовому.

Где в базовой агрегации вы просто «общие» совпавшие результаты и конечно $sort относится к полю, присутствующему в продукции, что на вашем примере будет значение «UserID» сейчас в _id ключе от агрегации , но также может быть «подсчитан» для заказа по общему счету, если захочет.

Эта часть порождает ошибку, так как $sort является полем, а не значением поля $ обозначение.

Но, конечно, для публикации в качестве доступной для клиентов коллекции вам необходимо заменить фактическое _id на что-то ожидаемое. Таким образом, здесь работает случайное генерирование id, равно как и включение других полей.

Для получения более подробной информации, а также альтернативы пакету «хаки», который работает только с установкой ванили, есть также this answer, который содержит полный список в качестве примера.

+0

console.log (results) дает мне сумму, но в шаблонах я все равно получаю индивидуальные значения, не вычисляемые. – Rexford

+0

См. Вопрос: http://stackoverflow.com/questions/34393216/meteor-aggregated-result-not-showing-in-template – Rexford