将站点配置存储为 Mongoose 模型

Storing site config as Mongoose model

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

Configuration是一个key数量有限的对象,类似于:

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

是否应该做一个键值对的集合?不确定在这种情况下如何执行 Mongoose 模式。

是否应该用单个文档做成一个集合?不确定如何保证一次只有一个文档。

还有其他选择吗?

好的,一次一件事情:

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

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} 
    });

虽然 "collection" 只有一份文件,但有点讽刺:)

另一种 "hack" 更适合您的解决方案是使用安全字段(您无法更改其值),并在该字段上添加唯一索引。 Read this for more info 该字段可以存在于文档中但不存在于模型(虚拟)中。同样,这很老套,但是您的用例还是有点奇怪 :)

上限方法有效,但它不允许更新字段。 使用 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 });

希望对你有所帮助