【发布时间】:2013-08-04 03:08:42
【问题描述】:
尝试在 Node.js 和 MongoDB 中找到唯一 ID,方法是创建一个 while 循环,在 MongoDB 中查询现有 ID,直到找到唯一值。如果 ID 已被使用,则在末尾增加一个数字,直到 Mongo 什么也不返回。
一切正常,除了break; 找到唯一 ID 时的语句。 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);
}
});
我做错了什么?
编辑:
如果有人需要,这里是使用 async 的固定代码:)
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);
}
});
【问题讨论】:
-
附注:一旦您修复了语法错误,您将拥有一个锁定的应用程序。您不能将同步
while (1)与异步.findOne()一起使用。后者要求发动机空转才能完成,而前者绝不允许。 -
找到唯一 ID 的最佳方法是什么?
-
@jrbaldwinn:很确定集合中的每个对象在添加时都会自动分配一个唯一的 ID。对象 ID 有点大而丑陋,但它被复制的机会,即使是在集群或其他任何地方,都介于微乎其微和没有之间。 :)
-
@cHao 说的好。为什么不使用 MongoDB 为每个文档自动创建的“_id”属性,而不是通过所有这些麻烦来创建唯一 ID?
-
它是根据用户提交的唯一URL生成,我希望我可以只使用_id
标签: javascript node.js mongodb asynchronous while-loop