2016-03-13 3 views
0

Модели данныхMongoose промежуточного слоя предварительно агрегированные данные, а затем использовать эти данные, чтобы сохранить документ

var mongoose = require('mongoose'); 
var Casenote = mongoose.model('Casenote'); 

var InvoiceSchema = new mongoose.Schema({ 
    start_date: {type: Date}, 
    end_date: {type: Date}, 
    created_on: {type: Date, default: Date.now}, 
    invoice_num: String, 
    month: String, 
    type: String, 
    provider_num: String, 
    rate_280: Number, 
    rate_285: Number, 
    rate_286: Number, 
    rate_287: Number, 
    rate_288: Number, 
    rate_290: Number, 
    qty_280: String, 
    qty_285: String, 
    qty_286: String, 
    qty_287: String, 
    qty_288: String, 
    qty_290: String, 
    total_280: Number, 
    total_285: Number, 
    total_286: Number, 
    total_287: Number, 
    total_288: Number, 
    total_290: Number 
}); 

InvoiceSchema.pre('save', function(next) { 

Casenote.aggregate([ 
    { 
     $match: { 
     "created_on": {"$gte": new Date(this.start_date)}, 
     "created_on": {"$lte": new Date(this.end_date)} 
     } 
    }, 
    { 
     $group: { 
     _id: "$pov", 
     count: {$sum: 1} 
     } 
    } 
    ], function(err, data) { 
    console.log(data); 
    }); 

    next(); 
}); 

mongoose.model('Invoice', InvoiceSchema); 

console.log(data) возвращает правильную информацию.

Что я хочу сделать, это получить доступ к данным для настройки предварительно настроенных данных до того, как save будет запущен на документе InvoiceSchema.

В общем обратном вызове this ссылается на объект глобального узла, а не на экземпляр InvoiceSchema.

Как получить доступ к информации, возвращаемой агрегированием, и установить ее на this, которая ссылается на экземпляр InvoiceSchema?

Пример того, что я хотел бы сделать в функции обратного вызова:

data.map(function(doc) { 
    if(doc._id === 280) { 
     this.qty_280 = doc.count; 
     this.total_280 = doc.count * this.rate_280; 
    } 
} 

ответ

0

Я надеюсь, что изменения контекста внутри совокупного обратного вызова, попробуйте это [Обновлено].

InvoiceSchema.pre('save', function(next) { 
    var self = this; 
    Casenote.aggregate([ 
    { 
     $match: { 
     "created_on": {"$gte": new Date(this.start_date)}, 
     "created_on": {"$lte": new Date(this.end_date)} 
     } 
    }, 
    { 
     $group: { 
     _id: "$pov", 
     count: {$sum: 1} 
     } 
    } 
    ], function(err, data) { 
     console.log(data, 'self has the invoice schema', self); 
     data.map(function(doc) { 
     if(doc._id === 280) { 
      self.qty_280 = doc.count; 
      self.total_280 = doc.count * self.rate_280; 
     } 
     }); 
     next(); 
    }); 
}); 
+0

Это будет хорошо иметь 'следующий()' 'вне if' блока, так как рядом должен быть вызван для всех объектов, которые не соответствуют, если условия слишком –

+0

Да, что я беспокойство' рядом() 'будет вызываться несколько раз? – zangw

+0

Да, вы правы. Затем следующий должен быть перемещен за пределы 'data.map'. Спасибо –

Смежные вопросы