Mongoose と MongoDB で登録フォームを作成しようとしています。一意のキー UserId があり、新しいエントリを作成するたびに、データベース内の最大の UserId を取得して 1 ずつ増やしたいと考えています。で試してみましdb.user.find({}).sort({userId: 1});
たが、うまくいかないようです。ありがとう
マシアール
あなたがしたいことは、自動インクリメントを備えたリレーショナル データベースのスキーマのように聞こえます。別の解決策をお勧めします。
最初は、すでに一意の 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})
これを実行して、現在最高のユーザーを取得できます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);
});