猫鼬独特的现场处理

时间:2019-01-13 16:45:51

标签: node.js mongoose mongoose-schema

我有一个未在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定义为唯一字段。我想我必须对错误进行处理,但是我只是找不到确切的内容。

1 个答案:

答案 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());
      }
    });
}

在这里,您将创建一个循环,该循环的迭代计数是未知的。.所以您确实需要提防它。.但是对于您的问题,这就是方法