2015-04-01 2 views
0

Привет, почему я получаю повторяющиеся ошибки ввода. Я делаю проверку заранее, если документ находится в базе данных. Моя модель требует уникальности для idName. Я загружаю данные из массива JSON, prooven только false, нет записей с true.MongoDb Duplicate Entry Error

async.map recipe.zutaten, 
    (ingredient, cb) -> 
    #Save all ingredients 
    ingredient.idName = ingredient.name.replace(/[^a-zA-Z0-9]+/gi, "").toLowerCase() 
    ingredientModel.find({ idName: ingredient.idName }, (err, ingredientFound) -> 
     return next err if err 

     ingredientsJson = {"idName":ingredient.idName, "name":ingredient.name, "amount":ingredient.amount} 
     #if found just pass it to recipes 
     if ingredientFound? && ingredientFound.length > 0 
     ingredientsJson.prooven = true 
     return cb null, ingredientsJson 
     #if not found evaluate if to save 
     else 
     #if not prooven just add the json to recipes 
     if(ingredient.prooven? && ingredient.prooven == false) 
      ingredientsJson.prooven = false 
      return cb null, ingredientsJson 
     #if prooven save it into database 
     else 
      ingredientDBObject = new ingredientModel() 
      ingredientDBObject.name = ingredient.name 
      ingredientDBObject.idName = ingredient.idName 
      ingredientDBObject.save((err) -> 
      return cb err if err 
      ingredientsJson.prooven = true 
      return cb null, ingredientsJson 
     ) 
    ) 
    ... 

Ошибка

{ [MongoError: insertDocument :: caused by :: 11000 E11000 duplicate key error index: database.ingredients.$idName_1 dup key: { : "zitronensaft" }] 
    name: 'MongoError', 
    message: 'insertDocument :: caused by :: 11000 E11000 duplicate key error index: database.ingredients.$idName_1 dup key: { : "zitronensaft" }', 
    index: 0, 
    code: 11000, 
    errmsg: 'insertDocument :: caused by :: 11000 E11000 duplicate key error index: database.ingredients.$idName_1 dup key: { : "zitronensaft" }' } 
+0

Я думаю, что проблема связана с асинхронным характером находки. Async выполняет итерацию через компоненты, даже если cb еще не возвращен. Я уже перемещал 'component.idName = component.name.replace (/ [^ a-zA-Z0-9] +/gi," ") .toLowerCase()' внутри функции поиска. –

ответ

0

Проблема связана с async.map не ждать обратного вызова. Исправлена ​​проблема использования async.mapSeries. Карта серия ждет свой центибара быть решена: https://github.com/caolan/async#mapSeries

... 
async.mapSeries recipes, 
    (recipe, next) -> 
    ...  
    async.mapSeries recipe.zutaten, 
     (ingredient, cb) -> 
      ...