【问题标题】:Mongoose set "id" property of document to be equal to "_id" of the document by defaultMongoose 默认设置文档的“id”属性等于文档的“_id”
【发布时间】:2021-04-02 05:39:19
【问题描述】:

我有一个需要“id”属性的模型。由于它需要是唯一的,我想在创建后将其值设置为与文档的“_id”属性相同。所以,我的模型看起来像这样:

const modelSchema = new Schema(
  {
    id: { type: String, unique: true },
    property_1: { type: String, unique: false }
    property_2: { type: String, unique: false }
    ...
  }
);

目前,我使用 2 个不同的查询来执行此操作,一个用于创建文档,另一个用于在文档创建后更新值为“_id”的“id”属性。

Model.create({
    propery_1: value_1,
    propery_2: value_2,
    ...
}).then((document) => {
    document.id = document._id;
    document.save();
})

有没有办法定义我的架构以默认支持这一点(“id”属性将自动设置为“_id”的值)。或者我可以将这两个查询替换为具有相同功能的查询。

【问题讨论】:

  • id 是一个virtual getter,它返回String_id 值。这会自动发生,除非您为该架构/模型指定id 选项为false,因为它的值已经是_id 的值,就像String 一样。您尝试如何/在哪里访问id?如果您的意思是从 API 响应中看不到 JSON 格式的 id,则需要确保启用了 virtuals 并指定在 toJSON 中返回它们。
  • 这只是真实案例的简化模型。我需要文档中的“id”和“_id”属性,因为应用程序的其余部分正在寻找“id”属性。因此,我需要在创建文档后将“id”属性设置为等于“_id”。我目前的方法有效,但我只是想检查一下,我可以用更简单的方式来做。
  • 文档保存后,您可以立即访问id,无需设置,猫鼬会自动设置。它实际上只是一个返回String(_id) 的虚拟属性。如果您在应用程序中设置断点并检查文档,您将看到它有类似get() id 的内容。您是否尝试过访问document.id?请记住,我的意思是它可以在实际文档中使用,除非您相应地指定 toJSONtoObject,否则它不会是 JSON。
  • 我设法用虚拟财产解决了这个问题。谢谢。

标签: javascript mongodb mongoose mongoose-schema


【解决方案1】:

我通过从架构中删除“id”字段并定义虚拟属性“id”来解决它。这样,Mongoose 会自动将字段“id”添加到文档中。代码如下所示:

const modelSchema = new Schema(
  {
    property_1: { type: String, unique: false }
    property_2: { type: String, unique: false }
    ...
  }, {
    toJSON: { virtuals: true },
    toObject: { virtuals: true }
  }
);

modelSchema.virtual('id', {
  id: this.id
});

添加toJSON: { virtuals: true }toObject: { virtuals: true } 很重要,因此默认情况下会将虚拟字段添加到文档中。

【讨论】:

    猜你喜欢
    • 2016-09-09
    • 1970-01-01
    • 2015-09-14
    • 2013-11-14
    • 2014-01-04
    • 2019-09-13
    相关资源
    最近更新 更多