将字段添加到从 Mongoose 模式派生的模型
Posted
技术标签:
【中文标题】将字段添加到从 Mongoose 模式派生的模型【英文标题】:Adding fields to model which derived from Mongoose schema 【发布时间】:2014-12-13 11:29:03 【问题描述】:我有一个看起来像这样的 Mongoose 架构:
ManifestSchema = new Schema(
entries: [
order_id: String,
line_item: , // <-- resolved at run time
address: ,// <-- resolved at run time
added_at: Number,
stop: Number,
]
, collection: 'manifests', strict: true );
在代码的某个地方我有这个:
Q.ninvoke(Manifests.findById(req.params.id), 'exec')
.then(function(manifest)
// ... so many things, like resolving the address and the item information
entry.line_item = item;
entry.address = order.delivery.address;
)
我面临的问题是,如果没有在架构中定义地址和 line_item,当我在运行时解决它们时,它们不会返回给用户,因为它们不在架构中......所以我添加了它们...这导致了我另一个不需要的行为:当我将对象保存回来时,地址和 line_item 都与清单对象一起保存,这是我想避免的。
是否可以在运行时向架构添加字段,但在返回时不保存它们?
我试图在猫鼬中使用“虚拟”,但它们确实提供了我需要的东西,因为我不是从模式创建模型,而是从数据库返回。
【问题讨论】:
【参考方案1】:在您的 manifest
Mongoose 实例上调用 toObject()
以创建一个纯 javascript 副本,您可以为用户响应添加额外的字段,而不会影响您需要保存的文档:
Q.ninvoke(Manifests.findById(req.params.id), 'exec')
.then(function(manifest)
var manifestResponse = manifest.toObject();
// ... so many things, like resolving the address and the item information
entry.line_item = item;
entry.address = order.delivery.address;
)
【讨论】:
非常感谢!你知道为什么会这样吗?是什么让从 mongoose 返回的实体与“普通 javascript”对象不同? @DanielFlippance 一个关键的区别是 Mongoose 文档的属性是使用Object.defineProperty
定义的。以上是关于将字段添加到从 Mongoose 模式派生的模型的主要内容,如果未能解决你的问题,请参考以下文章