1

我会尽量保持这个尽可能简单。我已经花了一整天的时间测试模块来做到这一点,在这一点上,我对我认为这将是我最好的选择的一切感到非常困惑。

我有一个架构:

var AppSchema = new mongoose.Schema({
    appid: { type: Number },
    appname: { type: String },
    appdesc: { type: String }
});
app.db.model('userApp', AppSchema);

使用 Express 并处理 POST,然后我想创建“一个新应用程序”

app.post('/app/new', function (req, res) {
    var newApp = app.db.models.userApp({
        appid: functionToIncreaseByOne(),
        appname: req.param('appname'),
        appdesc: req.param('appdesc')
    });
    newApp.save();
});

我删除了那里的大部分膨胀、重定向等,只是为了保持简单。所以我想做的是在添加的第一个应用程序首先将 APPID 设置为 1,然后为每个添加的新应用程序增加 +1。看起来很简单,但我经历了这么多复杂的例子,现在我的头很疼。

我想过只使用 .find 然后 orderby 来查找具有最高 appid 的应用程序,然后使用它并为其添加 +1,但我确信必须有另一种更简单的方法。我不希望 appid 在有更新时更改,我希望它设置的唯一时间是在第一个 POST 路线上创建新应用程序。

如果有人可以在这里帮助我或至少为我指明正确的方向,我将不胜感激。

4

1 回答 1

2

我可以看到几种方法。

首先,您可以存储last_id在全局变量中:

var last_id = 0;

app.post('/app/new', function (req, res) {
  var newApp = app.db.models.userApp({
    appid: ++last_id,
    appname: req.param('appname'),
    appdesc: req.param('appdesc')
  });
  newApp.save();
});

您可以添加适当的初始化last_id,以便在您的应用程序启动时“赶上”您的数据库。

node.js这种方法的唯一缺点是,如果您有多个进程,则无法使用它。

其次,您可以在每次要创建新文档时查询数据库:

app.post('/app/new', function (req, res, next) {
  app.db.models.userApp.find()
    .sort({_id: -1})
    .limit(1)
    .select('_id')
    .exec(function (err, docs) {
      if (err) return next(err);
      var newApp = app.db.models.userApp({
        appid: docs[0]._id,
        appname: req.param('appname'),
        appdesc: req.param('appdesc')
      });
      newApp.save();
    })
});

但是没有办法保证下一个find操作会发生在上一个save操作之后。因此,您的应用有可能会尝试将两个不同的文档与一个_id. 这就是为什么您应该尽可能避免使用此解决方案的原因。

第三,您可以使用其他一些存储(例如 Redis)在last_id每次阅读时自动递增:

var RedisClient = require('redis').createClient()

app.post('/app/new', function (req, res, next) {
  RedisClient.incr('last_id', function (err, next_id) {
    if (err) return next(err);
    var newApp = app.db.models.userApp({
      appid: next_id,
      appname: req.param('appname'),
      appdesc: req.param('appdesc')
    });
    newApp.save();
  })
});

此解决方案是最好的解决方案,但它需要安装额外的数据库。

于 2013-09-04T20:24:09.480 回答