我有一个API,允许用户添加intervalValue - 这将在我的程序中用于确定我的程序运行的频率。我在我的项目中使用节点js,express和mongodb。
这是允许用户添加值的API:
router.post('/', function(req, res, next) {
intervalValue.create(req.body, function(err, post) {
if (err) {
console.log(err);
} else {
res.json(post);
}
});
});
这是它的架构:
var intervalValueSchema = new mongoose.Schema({
milliseconds: {
type: Number,
min: 15000
}
}, {
capped: {
size: 1024,
max: 1,
autoIndexId: true
}
});
根据我的理解,这个模式只允许大于15000毫秒的毫秒值,并且因为它有上限,所以它只允许集合中的一个文档。
AIM:添加一个间隔值,然后只能修改该值 - 即不允许删除它,也不能再添加。因此,我需要它仅限于一个文件。
然而,使用当前代码,我可以向此集合添加多个文档(即使我isCapped()
我得到true
返回),当我更新值时,我可以插入一个值小于15000 - 不应该被允许。
这是更新API:
router.put('/updateValue/:id', function(req, res, next) {
intervalPoll.findByIdAndUpdate(req.params.id, req.body, {
new: true
}, function(err, post) {
if (err) {
console.log(err);
} else {
res.json(post);
}
});
});
我做错了什么 - 我是mongo的初学者,所以任何提示都会受到赞赏。另外,有没有更好的方法来实现我的目标?
谢谢!
答案 0 :(得分:1)
我不会公开该值的ID,我也不会使用:id来实现PUT处理程序(无论如何都不方便,因为用户必须知道曾经设置的ID永远不会改变且只有一个)。
我会实现两个端点:
router.get('/interval', ...
和
router.post('/interval', ...
# or:
router.put('/interval', ...
get处理程序将在数据库中搜索任何文档,如果存在则返回其值。如果没有这样的文档,它将返回一些默认值。
邮政处理程序将首先验证该值,然后修改文档(如果存在),或者如果文档不存在则将其插入。
我认为在这种情况下,在你的处理程序中检查这个数字会更容易,然后与Mongoose一起做你需要的事情。这是一个特定的用例。
以下是一些例子:
架构可以是:
mongoose.Schema({
milliseconds: Number
});
处理程序就是这样的 - 让我们说你的模型叫做Interval:
var defaultInterval = {milliseconds: 15000};
router.get('/interval', function(req, res, next) {
Interval.find().exec(function (err, intervals) {
if (err || intervals.length === 0) {
res.json(defaultInterval);
} else {
res.json({milliseconds: intervals[0].milliseconds});
}
});
});
router.put('/interval', function(req, res, next) {
var milliseconds = // get it from request
if (!milliseconds || milliseconds < 15000) {
// respond with error
} else {
Interval.findOneAndUpdate(
{}, {milliseconds: milliseconds}, {upsert: true},
function(err, interval){
if (err) {
// respond with error
} else {
// respond with success
}
}
);
}
});
这未经过测试,您需要填写空白,但您明白了。