0

我想将 _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,而猫鼬模式背后的原因是 _id 而不是 id。那么我可以解释一下,猫鼬不会自动添加映射到_id的虚拟ID吗?如果我错了,请纠正我。

4

1 回答 1

1

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

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

  • 默认情况下,猫鼬会给每个模式一个名为“id”的虚拟,它将是文档的 _id 作为字符串
  • 但是,默认情况下.toJSON不包括虚拟对象,因此当您将 mongoose 文档发送到浏览器中的主干时,它只会得到“_id”而不是“id”
  • 要快速获取包含虚拟对象的 JSON 表示,请使用myModelInstance.toJSON({virtuals: true}). 你会得到“_id”和“id”
  • 您需要阅读toObject 和 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;
于 2013-09-10T06:00:30.313 回答