首页 文章

使用'generic' virtual进行mongoose模式

提问于
浏览
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,而mongoose模式背后的原因是_id不是id . 那么我可以解释一下,mongoose不会自动添加映射到_id的虚拟ID吗?如果我错了,请纠正我 .

1 回答

  • 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;
    

相关问题