3

Mongoose と MongoDB で登録フォームを作成しようとしています。一意のキー UserId があり、新しいエントリを作成するたびに、データベース内の最大の UserId を取得して 1 ずつ増やしたいと考えています。で試してみましdb.user.find({}).sort({userId: 1});たが、うまくいかないようです。ありがとう

マシアール

4

2 に答える 2

6

あなたがしたいことは、自動インクリメントを備えたリレーショナル データベースのスキーマのように聞こえます。別の解決策をお勧めします。

最初は、すでに一意の ID を持っています。自動的に作成され、「_id」フィールドにあります。私にとっては、リレーションを構築するための UserID が必要なようですが、_id の値は既に使用できません。

インクリメントされたIDが必要なもう1つの理由は、Webアプリケーションを作成し、おそらく「より良い」URLが必要なためでしょうか? 例えば。/user/abc48df の代わりに /user/1...?

その場合は、ユーザー名に一意の制約を作成することをお勧めします。ID の代わりに、URL「/user/john」でユーザー名を使用します。

これにより、あなたの URL はより良くなります。リレーションの構築には _id を使用できます。また、最初に最大数をフェッチしても問題は発生しません。

一意のインデックスを作成するには:

db.collection.ensureIndex({username: 1}, {unique: true})
于 2011-05-19T13:07:48.663 に答える
6

これを実行して、現在最高のユーザーを取得できますUserId

db.user.insert( { UserId: 1 } )
db.user.insert( { UserId: 2 } )
db.user.insert( { UserId: 3 } )

db.user.find().sort( { UserId: -1 } ).limit(1)

MongoDB には、この値を取得して単一のアトミック トランザクションに新しいユーザーを挿入する方法がないことに注意してください。単一のドキュメントに対するアトミック操作のみがサポートされます。別の操作で別のユーザーが同時に挿入されないように注意する必要があります。同じ UserId を持つ 2 人のユーザーになる可能性があります。

カーソルを反復処理して、返されたドキュメントを配列に入れるには:

var myArray = [];
User.find().sort('UserId','descending').limit(1).each(function(err, doc) {
    myArray.push(doc);
});
于 2011-05-19T10:08:21.287 に答える