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's 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
という別のコレクションにプッシュします 。 - このサブスクリプションは公開されず、引数が変更されるたびに更新される可能性があるため、すべての結果をプッシュするだけの非常に単純なループを使用します。
- 集計の結果にはMongoObjectIDが含まれていないため、独自の任意のIDを生成します。
- アグリゲーションへのコールバックはファイバーでラップする必要があります。
Meteor.bindEnvironment
を使用しています ここでは、Future
を使用することもできます より低レベルの制御のために。
このようなパブリケーションの結果を組み合わせる場合は、ランダムに生成されたIDがマージボックスにどのように影響するかを慎重に検討する必要があります。ただし、これの簡単な実装は、Meteor APIをクライアント側で使用する方が便利なことを除けば、単なる標準のデータベースクエリです。
TL;DRバージョン :サーバーからデータをプッシュするほとんどの場合、publish
method
よりも望ましい 。
集計を行うさまざまな方法の詳細については、この投稿を確認してください 。