Ответ 1
Как и в случае с Meteor 0.6.5, API-интерфейс сбора данных не поддерживает запросы агрегирования, поскольку нет (прямолинейного) способа делать живые обновления на них. Однако вы все равно можете написать их сами и сделать их доступными в Meteor.publish
, хотя результат будет статичным. На мой взгляд, делать это таким образом, все же предпочтительнее, потому что вы можете объединить несколько агрегатов и использовать API-интерфейс коллекции на стороне клиента.
Meteor.publish("someAggregation", function (args) {
var sub = this;
// This works for Meteor 0.6.5
var db = MongoInternals.defaultRemoteCollectionDriver().mongo.db;
// Your arguments to Mongo aggregation. Make these however you want.
var pipeline = [
{ $match: doSomethingWith(args) },
{ $group: {
_id: whatWeAreGroupingWith(args),
count: { $sum: 1 }
}}
];
db.collection("server_collection_name").aggregate(
pipeline,
// Need to wrap the callback so it gets called in a Fiber.
Meteor.bindEnvironment(
function(err, result) {
// Add each of the results to the subscription.
_.each(result, function(e) {
// Generate a random disposable id for aggregated documents
sub.added("client_collection_name", Random.id(), {
key: e._id.somethingOfInterest,
count: e.count
});
});
sub.ready();
},
function(error) {
Meteor._debug( "Error doing aggregation: " + error);
}
)
);
});
Вышеприведенное является примером группировки/подсчета совокупности. Некоторые примечания:
- Когда вы это сделаете, вы, естественно, выполняете агрегацию на
server_collection_name
и нажимаете результаты на другую коллекцию под названиемclient_collection_name
. - Эта подписка не будет жить и, вероятно, будет обновляться при изменении аргументов, поэтому мы используем очень простой цикл, который просто выталкивает все результаты.
- Результаты агрегирования не имеют объектов Mongo ObjectID, поэтому мы генерируем некоторые из наших собственных.
- Обратный вызов агрегации должен быть завернут в Fiber. Здесь я использую
Meteor.bindEnvironment
, но для более низкого уровня управления можно использоватьFuture
.
Если вы начнете комбинировать результаты публикаций, подобные этим, вам нужно будет тщательно изучить, как случайно созданные идентификаторы влияют на поле слияния. Тем не менее, простая реализация этого метода - это просто стандартный запрос к базе данных, за исключением того, что удобнее использовать его с клиентской стороной Meteor API.
TL; версия DR. Почти в любое время, когда вы выталкиваете данные с сервера, publish
предпочтительнее method
.
Для получения дополнительной информации о различных способах агрегации, проверить это сообщение.