Node.jsとMongoDBで一意のIDを見つける際に、MongoDBに既存のIDを問い合わせるwhileループを作成して、一意の値が見つかるまで試みます。 IDが既に使用されている場合は、Mongoが何も返さなくなるまで、数字が最後にインクリメントされます。不正なbreak文(Node.js)
一意のIDが見つかった場合のbreak;
ステートメントを除き、すべて機能しています。 Node.jsのリターン:SyntaxError: Illegal break statement
コード:
db.collection('landmarks').findOne({'id':uniqueIDer}, function(err, data){
//if ID exists already
if (data.id){
var uniqueNumber = 1;
while (1) {
var uniqueNum_string = uniqueNumber.toString();
var newUnique = data.id + uniqueNum_string;
db.collection('landmarks').findOne({'id':newUnique}, function(err, data){
if (data.id){
uniqueNumber++;
}
else {
saveLandmark(newUnique);
break;
}
});
}
}
else {
saveLandmark(uniqueIDer);
}
});
私が間違っているのか?
EDIT:誰もがそれを必要とする場合
はここで非同期を使って固定コードです:)
db.collection('landmarks').findOne({'id':uniqueIDer}, function(err, data){
if (data){
var uniqueNumber = 1;
var newUnique;
async.forever(function (next) {
var uniqueNum_string = uniqueNumber.toString();
newUnique = data.id + uniqueNum_string;
db.collection('landmarks').findOne({'id':newUnique,'world':worldVal}, function(err, data){
if (data){
console.log('entry found!');
uniqueNumber++;
next();
}
else {
console.log('entry not found!');
next('unique!'); // This is where the looping is stopped
}
});
},
function() {
saveLandmark(newUnique);
});
}
else {
saveLandmark(uniqueIDer);
}
});
サイドノート:構文エラーが修正されると、アプリケーションがロックされます。非同期 '.findOne()'で同期 'while(1)'を使うことはできません。後者の場合、エンジンはアイドリング状態でなければなりません。 –
一意のIDを見つける最も良い方法は何ですか? – alyx
@ jrbaldwinn:コレクション内のすべてのオブジェクトに、追加するときに一意のIDが自動的に割り当てられていることを確かめてください。オブジェクトIDはちょっと大きくて醜いですが、クラスタなどでも複製される可能性は、スリムとnoneの間のどこかにあります。 :) – cHao