我有一个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}
});
如果有更好的结构,我愿意改变我的模型。我想要实现的基本操作是出现组中所有项目的总价格。
这些是我能想到的:
也许有更好的方法?
答案 0 :(得分:2)
您有几个合理的选择,主要取决于您如何使用该应用程序的其他部分。
选项1: 从您的组中查找商品ID,然后在{$ in:itemIds}聚合查询中使用这些ID。这需要双读,但要将写入保持在最低限度。如果您定期更新商品,此功能非常有用。如果您的主要操作是显示itemGroup
,则不那么有用选项2:更新itemGroup以包含更多缓存或计算的信息。这可能包括总价格,每当您更新相应的项目时都会重新计算。它还可以包括每个项目的价格: {title:'红色项目',项目:[{itemId:' I1',价格:2},{itemId:' I2',价格:3}] ......}
选项2的优点:允许简要显示数据并轻松重新计算总数。缺点:每次写入itemSchema都会成为对两个集合的双重写入。没有交易,所以会有一些点(无论多么简短),它们并不完全同步。
选项3:将整个itemSchema放在itemGroupSchema中。由于它们都来自一个文档,因此检索速度快,保存速度快。您甚至可以索引子文档。如果您在组中的项目数量或非常大的项目中无限制地增长,那么它也不会起作用。可能是我推荐的。