如何从文档中的集合中汇总数据

时间:2018-10-27 19:21:29

标签: mongodb mongoose

我有一个这样建模的文档:

{ 
  _id: '1', 
  timeEntries: [
    { _id: '1',
      hours: '1'
    },
    { _id: '2',
      hours: '2'
    },
  ],
  totalHours: 3
}

现在,每当我在文档中的timeEntries中添加一个timeEntry时,我也会在添加的timeEntry中将小时增加totalHours属性。

我希望能够在我的文档模型(虚拟字段?)上调用一个方法,而不是每次$ addToSet都增加一个,以从文档的timeEntries中获取总时数。

我该怎么做?

更新

此外,我的timeEntries实际上存储为引用数组。

示例:

[ 5bcf5e53e452b800134787dd, 5bcf5f42e452b800134787de ]

我需要一种方法来填充虚拟字段中的hours属性

模式:

const companyHourLogSchema = new Schema({
  dateOpened: {
  type: Date,
  default: Date.now,
 },
  dateClosed: {
  type: Date,
 },
  _id: {
  type: mongoose.Schema.ObjectId,
  auto: true,
 },
  company: {
  type: mongoose.Schema.ObjectId,
  ref: 'Company',
 },
  timeEntries: [{
  type: mongoose.Schema.ObjectId,
  ref: 'TimeEntry',
}],
  title: {
  type: String,
  default: 'Current',
},
});

1 个答案:

答案 0 :(得分:1)

更新

由于时间条目被保存为参考,因此您需要使用猫鼬populate首先获得条目

Model.find(/*your condition here*/).populate('timeEntries');

获取使用日志填充的timeEntries。


您可以按以下方式使用virtuals

schema.virtual('totalHours').get(function () {
     return this.timeEntries.reduce((agg,tiE) => agg + tiE.hours ,0);
});

然后您可以按以下方式使用它:

  console.log(modelInstance.totalHours);