Pada Meteor v1.0.4:
Jadi Anda bisa memanggil collection.rawCollection()
untuk mendapatkan objek koleksi yang mendasarinya:
var rawCollection = Orders.rawCollection();
rawCollection
. ini memiliki metode group
yang setara dengan group
metode di shell MongoDB. API simpul yang mendasarinya tidak sinkron, jadi Anda ingin mengubahnya menjadi fungsi sinkron. Kami tidak dapat menggunakan Meteor.wrapAsync
langsung sejak group
mengambil argumen fungsi yang bukan merupakan panggilan balik utama, jadi kami akan mengatasinya dengan pembungkus:
function ordersGroup(/* arguments */) {
var args = _.toArray(arguments);
return Meteor.wrapAsync(function (callback) {
rawCollection.group.apply(rawCollection, args.concat([callback]));
})();
}
Di dalam metode Anda, Anda dapat memanggil ordersGroup
seperti yang Anda lakukan db.orders.group
dalam cangkang Mongo. Namun, argumen diteruskan secara terpisah, bukan dalam objek:
ordersGroup(keys, condition, initial, reduce[, finalize[, command[, options]]])
Untuk informasi selengkapnya, lihat dokumentasi ini
(walaupun perhatikan bahwa callback
parameter harus ditinggalkan, karena pembungkus asinkron kami menanganinya).
Jadi, Anda harus meneruskannya secara terpisah:
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);
}
);
Tentu saja, ini hanya berfungsi di server, jadi pastikan metode Anda dalam kode khusus server (sebaiknya di server
subdirektori, atau di dalam if (Meteor.isServer)
).