如何实现项目的SUM

时间:2014-03-20 06:10:52

标签: node.js mongodb mongoose

我有一个MongoDB数据库,它有两个表,有ItemGroup,还有Item。 ItemGroup有一个名称和一套[]项,而Items保留实际价格。

我将MondoDB与NodeJS和Mongoose一起使用,我的模型定义如下:

var itemGroupSchema = new Schema({
    title   : {type: String, required: true},
    items   : [{type: Schema.Types.ObjectId, ref: 'Item'}],
    totalp  : Number,
    date    : {type: Date, default: Date.now}
});

var itemSchema = new Schema({
    _group  : {type: Schema.ObjectId, ref: 'ItemGroup'},
    name   : {type: String, required: true},
    price  : Number,
    date   : {type: Date, default: Date.now}
});

如果有更好的结构,我愿意改变我的模型。我想要实现的基本操作是出现组中所有项目的总价格。

这些是我能想到的:

  • 在我的itemGroup模型中有一个函数,该函数汇总了save上的所有项目。
  • 在itemGroup中有一个getter,它总结了get上的所有项目,totalp可以删除。
  • 在循环中汇总NodeJS中的所有项目,然后只更新itemGroup

也许有更好的方法?

1 个答案:

答案 0 :(得分:2)

您有几个合理的选择,主要取决于您如何使用该应用程序的其他部分。

选项1: 从您的组中查找商品ID,然后在{$ in:itemIds}聚合查询中使用这些ID。这需要双读,但要将写入保持在最低限度。如果您定期更新商品,此功能非常有用。如果您的主要操作是显示itemGroup

,则不那么有用

选项2:更新itemGroup以包含更多缓存或计算的信息。这可能包括总价格,每当您更新相应的项目时都会重新计算。它还可以包括每个项目的价格: {title:'红色项目',项目:[{itemId:' I1',价格:2},{itemId:' I2',价格:3}] ......}

选项2的优点:允许简要显示数据并轻松重新计算总数。缺点:每次写入itemSchema都会成为对两个集合的双重写入。没有交易,所以会有一些点(无论多么简短),它们并不完全同步。

选项3:将整个itemSchema放在itemGroupSchema中。由于它们都来自一个文档,因此检索速度快,保存速度快。您甚至可以索引子文档。如果您在组中的项目数量或非常大的项目中无限制地增长,那么它也不会起作用。可能是我推荐的。