Meteor v1.0.4以降:
したがって、collection.rawCollection()
を呼び出すことができます 基になるコレクションオブジェクトを取得するには:
var rawCollection = Orders.rawCollection();
このrawCollection
メソッドgroup
があります これはgroup
と同等です MongoDBシェルのメソッド。ただし、基盤となるノードAPIは非同期であるため、何らかの方法で同期関数に変換する必要があります。 Meteor.wrapAsync
は使用できません group
から直接 プライマリコールバックではない関数の引数を取るので、ラッパーを使用してこれを回避します:
function ordersGroup(/* arguments */) {
var args = _.toArray(arguments);
return Meteor.wrapAsync(function (callback) {
rawCollection.group.apply(rawCollection, args.concat([callback]));
})();
}
メソッド内で、ordersGroup
を呼び出すことができます db.orders.group
のように Mongoシェルで。ただし、引数はオブジェクトではなく、個別に渡されます。
ordersGroup(keys, condition, initial, reduce[, finalize[, command[, options]]])
詳細については、このドキュメント
を参照してください。 (ただし、callback
非同期ラッピングで処理されるため、パラメータは省略してください。
したがって、それらを個別に渡す必要があります:
var result = ordersGroup(
// keys
function(doc) {
return { year: doc.createdAt.toISOString().substring(0, 4) };
},
// condition
{createdAt: {$lt: new Date("2015-12-31"), $gt: new Date("2015-01-01")}},
// initial
{months: {}},
// reduce
function(order, result) {
var month = order.createdAt.getMonth()+1,
date = order.createdAt.getDate();
month = result.months[month] || (result.months[month] = {});
date = month[date] || (month[date] = []);
date.push(order);
}
);
もちろん、これはサーバー上でのみ機能するため、メソッドがサーバーのみのコード(できればserver
内)にあることを確認してください サブディレクトリ、またはif (Meteor.isServer)
内 。