我有一个未在Google中找到答案的问题。这是关于猫鼬并保存具有唯一字段的对象。
例如,我有一个模型,我们称之为产品。它应该具有唯一的数字ID,假设该字段的名称为productId。现在,我只生成随机的16位数字:
var id = (Math.random()+' ').substring(2,10)+(Math.random()+' ').substring(2,10);
然后创建产品:
var product = { productId: id }
Product.create(product, (err, product) => { rest goes here });
因此,实际的问题是:我如何检查具有该ID的产品是否已经存在,并且如果确实存在,请根据需要重新生成ID多次,直到没有任何具有该productId的产品,并且然后创建它。
在模式中,我将productId定义为唯一字段。我想我必须对错误进行处理,但是我只是找不到确切的内容。
答案 0 :(得分:0)
MongoDb默认情况下会为您创建一个唯一的对象ID,即使您不必费心尝试创建一个ID。由于您还为产品创建了随机ID,因此我的建议是您不必担心创建唯一ID。
但是,如果您真的坚持要创建唯一的ID,如果添加了唯一的属性,则使用猫鼬,这时如果有人尝试添加非唯一的ID,则会自动引发错误。因此,您无需担心对其进行验证,猫鼬默认会对其进行处理。
关于您查找用户是否存在该用户的问题
如果存在再次尝试重新创建唯一ID的问题,则存在未知的迭代时间问题,它将在最坏的情况下运行。 因此,请考虑一下,如果发生最坏的情况,如果迭代超过100次,会发生什么情况。 (从数学上讲-这是100倍迭代值的概率,可能不正确,但例如)。
因此,如果您想抓住这个机会继续前进,可以这样做
function genId(){
return (Math.random()+' ').substring(2,10)+(Math.random()+' ').substring(2,10);
}
recreateOrInsert(genId());
function recreateOrInsert(id){
Product.find({productId:id},(err,data)=>{
if(err)throw err;
if(data.length==0){ //remember here data comes as an array
var product = { productId: id };
Product.create(product, (err, product) => { rest goes here });
}else{
recreateOrInsert(genId());
}
});
}
在这里,您将创建一个循环,该循环的迭代计数是未知的。.所以您确实需要提防它。.但是对于您的问题,这就是方法