猫鼬独特的字段处理

Mongoose unique field handling

我有一个问题,但我在 Google 中找不到答案。它是关于猫鼬和保存一个具有唯一字段的对象。

例如,我有一个模型,我们称它为Product。它应该有一个唯一的数字 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 的产品为止, 然后才创建它。

在 Schema 中,我将 productId 定义为唯一字段。我想我必须做一些错误处理,但我找不到确切的内容。

MongoDb 默认情况下为您创建一个唯一的对象 ID,即使您懒得尝试创建一个 ID。由于您还为产品创建了一个随机 ID,我的建议是您无需担心创建唯一 ID。

但是如果你真的坚持创建一个唯一的id,如果你添加唯一的属性使用mongoose,在某个时候如果有人试图添加一个不唯一的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());
      }
    });
}

在这里你将创建一个迭代次数未知的循环..所以你真的需要注意它..但是对于你的问题,这是方法