Kể từ Meteor v1.0.4:
Vì vậy, bạn có thể gọi collection.rawCollection()
để lấy đối tượng thu thập cơ bản:
var rawCollection = Orders.rawCollection();
rawCollection
này có một phương thức group
tương đương với nhóm group
trong MongoDB shell. Tuy nhiên, API nút cơ bản là không đồng bộ, vì vậy bạn sẽ muốn chuyển đổi nó thành một hàm đồng bộ bằng cách nào đó. Chúng tôi không thể sử dụng Meteor.wrapAsync
trực tiếp từ group
nhận các đối số hàm không phải là lệnh gọi lại chính, vì vậy chúng tôi sẽ giải quyết vấn đề này bằng một wrapper:
function ordersGroup(/* arguments */) {
var args = _.toArray(arguments);
return Meteor.wrapAsync(function (callback) {
rawCollection.group.apply(rawCollection, args.concat([callback]));
})();
}
Bên trong phương thức của mình, bạn có thể gọi ordersGroup
như bạn muốn db.orders.group
trong vỏ Mongo. Tuy nhiên, các đối số được truyền riêng rẽ, thay vì trong một đối tượng:
ordersGroup(keys, condition, initial, reduce[, finalize[, command[, options]]])
Để biết thêm thông tin, hãy xem tài liệu này
(mặc dù lưu ý rằng callback
nên bỏ qua tham số, vì gói không đồng bộ của chúng tôi sẽ xử lý điều đó).
Vì vậy, bạn sẽ phải chuyển chúng vào một cách riêng biệt:
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);
}
);
Tất nhiên, điều này chỉ hoạt động trên máy chủ, vì vậy hãy đảm bảo rằng phương thức của bạn ở mã chỉ dành cho máy chủ (tốt nhất là trong server
thư mục con hoặc bên trong if (Meteor.isServer)
).