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。そのため、アプリが 2 つの異なるドキュメントを 1 つに保存しようとする可能性があります_id。可能であれば、このソリューションを避ける必要があるのはそのためです。

3 番目に、他のストレージ (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 に答える