如何将我的收藏大小限制为仅一个文档?

时间:2016-11-11 11:45:35

标签: node.js mongodb express mongoose

我有一个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的初学者,所以任何提示都会受到赞赏。另外,有没有更好的方法来实现我的目标?

谢谢!

1 个答案:

答案 0 :(得分:1)

我不会公开该值的ID,我也不会使用:id来实现PUT处理程序(无论如何都不方便,因为用户必须知道曾经设置的ID永远不会改变且只有一个)。

我会实现两个端点:

router.get('/interval', ...

router.post('/interval', ...
# or:
router.put('/interval', ...

get处理程序将在数据库中搜索任何文档,如果存在则返回其值。如果没有这样的文档,它将返回一些默认值。

邮政处理程序将首先验证该值,然后修改文档(如果存在),或者如果文档不存在则将其插入。

我认为在这种情况下,在你的处理程序中检查这个数字会更容易,然后与Mongoose一起做你需要的事情。这是一个特定的用例。

UDATE

以下是一些例子:

架构可以是:

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

这未经过测试,您需要填写空白,但您明白了。