将站点配置存储为Mongoose模型

时间:2016-11-30 07:50:56

标签: node.js mongodb mongoose mongoose-schema

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

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

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

它应该是一个带键值条目的集合吗?在这种情况下,不确定如何强制执行Mongoose模式。

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

还有其他选择吗?

2 个答案:

答案 0 :(得分:2)

好的,一次一件事:

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

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

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

我建议您浏览Mongoose允许的多个选项,here

您的one-doc集合的Schema类似于:

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

有一个"收集"有一些讽刺意味。但是只有一个文件:)

另一个" hack"可以更好地为您工作的解决方案是使用安全字段(您无法更改其值),并在该字段上添加唯一索引。 Read this for more info该字段可能存在于文档中,但不存在于模型中(虚拟)。再次,这是hacky,但无论如何你的用例有点奇怪:)

答案 1 :(得分:1)

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

此外,您可以在架构中添加collection选项,以防止猫鼬对集合名称进行复数处理

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

我希望它将对您有帮助