将站点配置存储为 Mongoose 模型

Posted

技术标签:

【中文标题】将站点配置存储为 Mongoose 模型【英文标题】:Storing site config as Mongoose model 【发布时间】:2017-04-14 10:57:53 【问题描述】:

我有网站配置(当前存储为 JSON 文件),我想将其移至 MongoDB,并可能使用 Mongoose 处理读写操作并通过模式执行验证。

配置是一个键数量有限的对象,类似于:


  siteOffline: false,
  storeOffline: false,
  priceMultipliers: 
    a1: 0.96
    a2: 0.85
  ,
  ...

是否应该将其做成一个包含键值条目的集合?不确定在这种情况下如何强制执行 Mongoose 模式。

是否应该将其做成一个包含单个文档的集合?不知道如何保证一次只有一个文档。

还有其他选择吗?

【问题讨论】:

所以您一次只需要存储一个文档?我不确定你是否需要一个数据库。 Mongo 模式用于存储相同数据结构(AKA 结构化数据)的多个实例 是的,一次一个。我可以使用静态 JSON 文件进行只读访问,但是由于应该从后端实时修改配置并且已经使用了 Mongoose,我想将其用于验证、并发访问和缓存插件等开。 【参考方案1】:

好的,一次一件事:

如果你想使用猫鼬,你应该把你的完整配置作为一个文档:

var siteConfig = new Schema(
  siteOffline: Boolean,
  storeOffline: Boolean,
  priceMultipliers: 
    a1: Number
    a2: Number
   
);

然后,如果你想要一个只有一个文档的集合,你可以使用MongoDB capped collections

我建议你通过 Mongoose 允许的多个选项,here

您的单文档集合的架构类似于:

   var config = new Schema(
      siteOffline: Boolean,
      storeOffline: Boolean,
      priceMultipliers: 
        a1: Number
        a2: Number
       
    ,  
      collection:'config',
      capped:  size: 1024, max: 1 
    );

虽然“收集”只有一个文档,但有些讽刺:)

另一个更适合您的“破解”解决方案是使用安全字段(您无法更改其值),并在该字段上添加唯一索引。 Read this for more info 该字段可能存在于文档中,但不在模型中(虚拟)。同样,这很hacky,但无论如何你的用例有点奇怪:)

【讨论】:

封顶集合看起来很巧妙。但是,让我担心的是更新文档。通常,最好执行“查找并更新插入”之类的操作,而封盖集合似乎仅限于插入。 它很简洁,但绝对非常hacky。我会尝试提供替代方案。 谢谢,我最终得到了具有默认值的唯一字段,它是该字段唯一允许的值。但是有上限的方法也可以。【参考方案2】:

上限方法有效,但不允许更新字段。 使用 immutable 字段属性 (>= mongoose v5.6) 有更好的解决方案。

此外,您可以在架构中添加collection 选项,以防止 mongoose 将集合名称复数

let configSchema = new Schema(
    
        _immutable: 
            type: Boolean,
            default: true,
            required: true,
            unique : true,
            immutable: true,
        ,

        siteOffline: Boolean,
        storeOffline: Boolean,
        priceMultipliers: 
            a1: Number
            a2: Number
        ,
    ,
    
        collection:'config',
    
);

var Config = mongoose.model( 'config', configSchema );
Config.updateOne( ,  siteOffline: false );

希望对你有帮助

【讨论】:

谢谢,这看起来很有希望。我还没有使用不可变字段。 _immutable 是随机的内部名称,会施加限制,不是吗?您能否在答案中添加它应该如何更新? 我刚刚更新了答案。更新时没有什么特别的事情要做。您可以将“_immutable”替换为任何其他字段名。

以上是关于将站点配置存储为 Mongoose 模型的主要内容,如果未能解决你的问题,请参考以下文章

使用 geojson 和 mongoose 将多边形坐标插入 Mongo DB 时出错

mongo 进阶之—— mongoose 基本操作

mongo 进阶之—— mongoose 基本操作

使用Mongoose(ORM)将多个应用程序与一个mongo数据库连接

将 mongoose 与预先存在的 mongo 集合连接

将 mongoose 与预先存在的 mongo 集合连接