我有网站配置(目前存储为JSON文件),我想将其移至MongoDB,并可能使用Mongoose来处理读写操作并通过模式执行验证。
配置是一个密钥数量有限的对象,类似于:
{
siteOffline: false,
storeOffline: false,
priceMultipliers: {
a1: 0.96
a2: 0.85
},
...
}
它应该是一个带键值条目的集合吗?在这种情况下,不确定如何强制执行Mongoose模式。
是否应该使用单个文档制作一个集合?不确定如何保证一次只有一个文档。
还有其他选择吗?
答案 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 });
我希望它将对您有帮助