在不存储所有属性的情况下扩展Mongoose模型

我正在构build一个基于Node.js + Express + Mongoose的CMS。 我想要业务和数据访问方法的抽象层。 所以我有包含与数据库调用的方法的biz类。

这些调用是直接使用Mongoose模型,所以我的逻辑实体是Mongoose实体

问题是某个逻辑实体并不总是与其数据库实体相同

例如:我有一个名为“Item”的模型及其属性,这些属性必须存储到数据库中,这很好。 现在,我需要一个新的属性,一个名为“similar_items”的数组,最终可以包含其他项目的列表,但我不想将此属性存储在数据库中。

var itemSchema = new Schema({ id: { type: Number, index: true }, name: { type: String } }); var item = mongoose.model('Item', itemSchema); var data = new Item(); /* do stuff.... */ data.similar_items = blahblah; //I can't set this property as it doesn't exists! 

是否有可能扩展一个Mongoose模型的属性超出其架构? 我知道我可以用getter和setter来定义虚拟属性,但是我仍然没有“地方”来存储我的数组。

任何想法? 我应该分开我的逻辑和Mongoose模型?

如果你在这个时候把data作为一个Mongoose实例完成,调用toObject()将其转换为一个普通的JS对象,你可以自由修改:

 data = data.toObject(); data.similar_items = blahblah; 

您不能在模式中指定它,而是使用mongoose模型添加额外的属性。 如果要保存添加的属性,则必须在模式级别添加此属性。 否则使用toobject()方法在正常的JavaScript对象中传递它。

 data = data.toObject(); data.any_property_name = required_value; 

有一件事你不能在数据库中保存这个对象。 因为它是一个普通的JavaScript对象。