使用'generic'虚拟用于mongoose模式

时间:2013-09-10 05:46:48

标签: node.js mongodb mongoose

我想将_id变量转换为id。

所以我想在我要创建的所有模式中添加虚拟'id'字段,只要我访问模型的'id'字段,就会返回'_id'的值。

来自文档http://mongoosejs.com/docs/2.7.x/docs/virtuals.html 我发现,首先我必须创建模式然后单独应用虚拟'id'字段。

我想简单地将虚拟字段添加到基础mongoose.Schema,然后每当我创建新模式时,所有模式都将具有虚拟字段,而无需对每个模式进行任何手动操作。

编辑:

我也在使用Backbone.Model,我为每个模型创建了一个'id'字段。如果我在前端代码中得到简单的使用id,我得到id字段不存在的错误。但是当我将idAttribute设置为每个模型的“_id”时,一切都顺利。这意味着骨干模型想拥有_id,而mongoose模式背后的原因是_id不是id。那我可以解释一下,mongoose不会自动添加映射到_id的虚拟ID吗?如果我错了,请纠正我。

1 个答案:

答案 0 :(得分:1)

对于主干,“id”是它的默认idAttribute名称,所以不要在那里添加任何代码,一切都会按预期工作。

对于猫鼬而言,答案归结为“它很复杂”,但主要观点是:

  • 默认情况下,mongoose会为每个架构提供一个名为“id”的虚拟文件,该文件的_id为字符串
  • 但是,默认情况下.toJSON不包含虚拟内容,因此当您在浏览器中将mongoose文档发送到主干网时,它只是“_id”而不是“id”
  • 要快速获取包含虚拟内容的JSON表示,请使用myModelInstance.toJSON({virtuals: true})。你会得到“_id”和“id”
  • 您需要阅读transform options for toObject and toJSON以全面了解您可以做什么以及如何做,但要点是(基于直接来自文档的示例)

// specify the transform schema option
if (!schema.options.toJSON) schema.options.toJSON = {};
schema.options.toJSON.transform = function (doc, ret, options) {
  // remove the _id of every document before returning the result
  delete ret._id;
}
schema.options.toJSON.virtuals = true;