Source: mongodb/models/aggregation.js

/**
 * @module mongodb/models/aggregation
 */

var mongoose = require('mongoose');
var deepPopulate = require('mongoose-deep-populate');
var Schema = mongoose.Schema;
var util = require('util');
var _ = require('underscore');
var mongooseApiQuery = require('mongoose-api-query');

/**
 * Primary ad stats aggregation collection.  Very flat schema for flexible aggregation.
 *
 * @class
 * @type {Schema}
 */
var hourlyAdStatSchema = new Schema({
    tstamp:             { type: Date, default: Date.now },
    hour:               { type: Date, required: true,  index: true },
    publisher:          { type: Schema.ObjectId, ref: 'Publisher' },
    site:               { type: Schema.ObjectId, ref: 'Site' },
    page:               { type: Schema.ObjectId, ref: 'Page' },
    placement:          { type: Schema.ObjectId, ref: 'Placement' },
    advertiser:         { type: Schema.ObjectId, ref: 'Advertiser' },
    campaign:           { type: Schema.ObjectId, ref: 'Campaign' },
    creativegroup:      { type: Schema.ObjectId, ref: 'CreativeGroup' },
    creative:           { type: Schema.ObjectId, ref: 'Creative' },
    actionbeacon:       { type: Schema.ObjectId, ref: 'ActionBeacon' },
    pub_clique:         { type: String, required: true, ref: 'Clique' },
    adv_clique:         { type: String, required: true, ref: 'Clique' },
    bids:               { type: Number, min: 0, required: true, default: 0 },
    imps:               { type: Number, min: 0, required: true, default: 0 },
    defaults:           { type: Number, min: 0, required: true, default: 0 },
    spend:              { type: Number, min: 0, required: true, default: 0 },
    clicks:             { type: Number, min: 0, required: true, default: 0 },
    view_convs:         { type: Number, min: 0, required: true, default: 0 },
    click_convs:        { type: Number, min: 0, required: true, default: 0 },
    uniques:            { type: Number, min: 0, required: true, default: 0 }
});
hourlyAdStatSchema.plugin(deepPopulate, {});
hourlyAdStatSchema.plugin(mongooseApiQuery);
var HourlyAdStat = mongoose.model('HourlyAdStat', hourlyAdStatSchema);

/**
 * Geo ad stats aggregation collection. Flat schema for flexible aggregation, also includes
 * geo-specific fields with refs to Geo collections for geo aggregation.
 *
 * @class
 * @type {Schema}
 */
var geoAdStatSchema = new Schema({
    tstamp:             { type: Date, default: Date.now },
    hour:               { type: Date, required: true,  index: true },
    publisher:          { type: Schema.ObjectId, ref: 'Publisher' },
    site:               { type: Schema.ObjectId, ref: 'Site' },
    page:               { type: Schema.ObjectId, ref: 'Page' },
    advertiser:         { type: Schema.ObjectId, ref: 'Advertiser' },
    campaign:           { type: Schema.ObjectId, ref: 'Campaign' },
    pub_clique:         { type: String, required: true },
    adv_clique:         { type: String, required: true },
    country:            { type: Schema.ObjectId, ref: 'Country' },
    region:             { type: Schema.ObjectId, ref: 'Region' },
    dma:                { type: Schema.ObjectId, ref: 'DMA' },
    bids:               { type: Number, min: 0, required: true, default: 0 },
    imps:               { type: Number, min: 0, required: true, default: 0 },
    defaults:           { type: Number, min: 0, required: true, default: 0 },
    spend:              { type: Number, min: 0, required: true, default: 0 },
    clicks:             { type: Number, min: 0, required: true, default: 0 },
    view_convs:         { type: Number, min: 0, required: true, default: 0 },
    click_convs:        { type: Number, min: 0, required: true, default: 0 },
    uniques:            { type: Number, min: 0, default: 0 }
});
geoAdStatSchema.plugin(deepPopulate, {});
geoAdStatSchema.plugin(mongooseApiQuery);
var GeoAdStat = mongoose.model('GeoAdStat', geoAdStatSchema);

/**
 * Models wrapper to be instantiated w/ specific DB connection instance.
 *
 * @param {mongoose.connection} connection DB connection object
 * @param {Object} options
 * @constructor
 */
var AggregationModels = function(connection){
    this.connection = connection;
    this.DemoHourlyAdStat = this.connection.model('DemoHourlyAdStat', hourlyAdStatSchema);
    this.HourlyAdStat = this.connection.model('HourlyAdStat');
    this.GeoAdStat = this.connection.model('GeoAdStat');
};
exports.AggregationModels = AggregationModels;