Вы можете рассчитать эти агрегаты либо с помощью функции map-Reduce, либо с помощью функции group () .Я использую group (), потому что это немного проще и быстрее, однако вы должны использовать map-lower, если вам нужно распределить запрос по изолированному кластеру.
Сначала загрузите данные:
db.orders.insert( { teamid: 100, date: "4/1", amount: 50 })
db.orders.insert( { teamid: 100, date: "4/1", amount: 40 })
db.orders.insert( { teamid: 200, date: "4/2", amount: 50 })
db.orders.insert( { teamid: 100, date: "4/2", amount: 20 })
Для команды в день:
db.orders.group({
key: { teamid: true, date: true },
reduce: function(doc, out) { out.sum += doc.amount; out.count++; },
initial: { sum: 0, count: 0 },
finalize: function(out) { out.average = out.sum / out.count }
});
Чтобы свернуть ежедневные агрегаты, просто измените ключ:
db.orders.group({
key: { date: true },
reduce: function(doc, out) { out.sum += doc.amount; out.count++; },
initial: { sum: 0, count: 0 },
finalize: function(out) { out.average = out.sum / out.count }
});