Мангуст уникальная обработка поля - PullRequest
0 голосов
/ 13 января 2019

У меня есть вопрос, на который я не нашел ответа в Google. Речь идет о мангусте и сохранении объекта с уникальным полем.

Например, у меня есть модель, назовем ее Product. Он должен иметь уникальный числовой идентификатор, скажем, имя поля будет 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 });

И поэтому фактический вопрос таков: как я могу проверить, существует ли Продукт с этим идентификатором, и если это произойдет случайно, сгенерируйте идентификатор столько раз, сколько потребуется, пока продукта с этим идентификатором продукта не будет, и только тогда создайте его.

В схеме я определяю productId как уникальное поле. Думаю, мне нужно что-то делать с обработкой ошибок, но я просто не могу найти, что именно.

1 Ответ

0 голосов
/ 14 января 2019

MongoDb создает уникальный идентификатор объекта для вас по умолчанию, даже если вы не пытаетесь создать идентификатор. Поскольку вы также создаете случайный идентификатор для продукта, я рекомендую вам не беспокоиться о создании уникального идентификатора.

но если вы действительно настаиваете на создании уникального идентификатора, используя mongoose, если добавляете уникальный атрибут, в тот момент, когда кто-то пытается добавить не уникальный идентификатор, он автоматически выдаст ошибку. Так что вам не нужно беспокоиться о проверке этого, мангуст обрабатывает его по умолчанию.

что касается вашей проблемы с поиском пользователя, существует ли пользователь уже

если существует попытка повторного создания уникального идентификатора, то возникает проблема неизвестного времени итераций, которая будет выполняться в худшем случае. так что, учитывая, что произойдет, если наихудший случай, скажем, если он повторяется более 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());
      }
    });
}

Здесь вы создадите цикл, число итераций которого неизвестно .. поэтому вам действительно нужно следить за ним ... но что касается вашего вопроса, то это путь

...