【问题标题】:How do I add new keys to a Mongoose Schema?如何向 Mongoose Schema 添加新密钥?
【发布时间】:2019-04-12 14:51:56
【问题描述】:

我最近开始为我的高级项目开发一个应用程序,它需要我使用某种类型的数据库。为此,我决定使用 Mongoose,因为它不是 SQL,而且更容易上手。

所以,快进,我遇到了一个问题,我不知道如何编辑已经存在的架构并向其中添加新键。

例如,我有一个代表帖子(想想推文或 Facebook 帖子)的架构:

  • 包含帖子正文的字符串
  • 创建帖子的用户的 ID
  • 帖子的创建日期

我的代码是:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

// Create Schema
const PostsSchema = new Schema({
  Value: {
    type: String,
    required: true
  },
  User: {
    type: Schema.Types.ObjectId,
    ref:'users'
  },
  Date: {
    type: Date,
    default: Date.now
  }
});

// Create collection and add schema
mongoose.model('posts', PostsSchema, 'posts');

我现在想要的是以某种方式访问​​该架构并使用类似于可能的东西向它添加一个新密钥

PostsSchema.add({Private: { default: false}});

意思是,现在数据库中的模式将如下所示:

{
    "_id": {
        "$oid": "1831g98af21n9s5u7s9ccchj5"
    },
    "Value": "Beautiful day outside, can't wait to go jogging!",
    "User": {
        "$oid": "9a79ab143lbk9lk55wq327oi3226m"
    },
    "Date": {
        "$date": "2018-10-29T01:28:44.408Z"
    },
    "Private":  "false"
    "__v": 0
}

回到我的问题,有什么方法可以做到这一点吗?或者,如果您有此类方法文档的链接,我将不胜感激。非常感谢!

【问题讨论】:

标签: javascript mongodb mongoose mlab


【解决方案1】:

只需使用 default 将字段添加到架构中:

const PostsSchema = new Schema({
  Value: {
    type: String,
    required: true
  },
  User: {
    type: Schema.Types.ObjectId,
    ref:'users'
  },
  Date: {
    type: Date,
    default: Date.now
  },
  Private: {type: Boolean, default: 'false'}
});

由于您拥有default,因此在您添加private 字段之前,任何新记录以及旧模型的任何新实例都会拥有它。

如果您真的需要更多 dynamic 方法,通常的建议是使用 Mixed Type 以及它带来的所有优点和缺点。

【讨论】:

  • 我知道你的建议,但我想动态地做,如果我可以这样称呼的话。为了更好地解释,想象一个允许用户创建自己的人的应用程序。默认情况下,我们可能会给出人的键,例如手臂、腿、头等。现在您可能希望允许用户向 Schema 添加不同的特征,例如躯干、鼻子等。这是一个非常基本的示例,但它本质上是我想要访问的功能,因此我可以编辑已经存在的架构。
  • 不是设计或推荐为最佳实践的东西。更多信息:github.com/Automattic/mongoose/issues/1867
  • 什么是我最初的方法而不是修改初始架构的好选择?
  • 我更新答案时通常的建议是简单地使用混合类型。这样你就可以添加任何你想要的东西。它很灵活,但您必须处理更改跟踪等。
猜你喜欢
  • 2021-02-23
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多