将站点配置存储为 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 });
希望对你有所帮助
我有网站配置(目前存储为 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 });
希望对你有所帮助