【问题标题】:Using 'generic' virtual for mongoose schema对猫鼬模式使用“通用”虚拟
【发布时间】:2013-09-13 17:23:27
【问题描述】:

我想将 _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吗?如果我错了,请纠正我。

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 2016-04-09
      • 1970-01-01
      • 2021-01-09
      • 1970-01-01
      • 1970-01-01
      • 2016-09-13
      • 2021-04-03
      • 2017-04-04
      • 1970-01-01
      相关资源
      最近更新 更多