2011-05-19 10 views
3

mongooseとMongoDBで登録フォームを作成しようとしています。私はユニークなキーUserIdを持っています。新しいエントリを作成するたびに、データベースで最大のUserIdを取得して1つ増やしたいと考えています。 db.user.find({}).sort({userId: 1});で試しましたが、うまくいかないようです。 おかげMongoDB order by "number"昇順

Masiar

+0

http://www.mongodb.org/display/DOCS/How+to+Make+an+Auto+Incrementing+Field – Industrial

答えて

6

:カーソルを反復するために、配列で返されたドキュメントを入れます

。私は別の解決策をお勧めします。

最初はすでに一意のIDを持っています。自動的に作成され、 "_id"フィールドにあります。私にとっては、あなたが関係を構築するためのUserIDを持っていると思われますが、あなたはすでに_idの値を使用しています。

idsを増やしたいと思うもう一つの理由は、Webアプリケーションを作成し、「より良い」URLを必要としている可能性があります。例えば。/user/abc48dfの代わりに/ user/1 ...?

これが当てはまる場合は、ユーザー名に固有の制約を作成することをお勧めします。そしてidの代わりに、あなたは "/ user/john"というURLのユーザ名を使用します。

これであなたのURLははるかに良いです。そして、関係を構築するために_idを使用することができます。そして、あなたは一番高い数字を偽装することに問題はありません。

db.collection.ensureIndex({username: 1}, {unique: true}) 
+0

最後に、あなたが示唆していたように、ありがとう! – Masiar

+0

また、 '_id'フィールドをオーバーライドすることもできます。そのフィールドは自動的にユニークです。あなたのユーザが一意の名前を持っているなら、あなたは '_id: 'gates' 'でそれらを保存し、あなた自身もインデックスを保存することができます。 –

+0

"_id"に名前を入れることはお勧めしません。アプリケーションでは、便利な名前の「username」の代わりに「_id」フィールドを使用します。それは他のプログラマが読む/理解するのが難しいかもしれません。第二に、関係を構築した場合、ユーザー名を変更することはできません。ユーザー名を変更すると、すべての関係が破棄されます。または、すべての関係も変更する必要があります。 –

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

おかげで、ほんの少しの質問:ユニークなインデックスを作成するには

。あなたが私に言った操作は配列を返しますか?これはvar result = db.user.find()。sort({UserId:-1}).limit(1);となります。右? – Masiar

+0

これは、単一の値ではなくカーソルを返すので、繰り返し処理して配列にロードできます。 –

+0

どのようにそれを反復するかについての手掛かりはありますか?私はconsole.logにしようとしましたが、 '{model:[Function:model]、op: 'find'}'のような奇妙なものを出力します。 – Masiar