2014-02-02 8 views
0

В моем приложении node.js маршрут выполняется по запросу Ajax и он всегда получает параллельные запросы.Node.js: Mongodb - параллельные запросы

Мое требование состоит в том, чтобы проверить аналогичный документ и, если существует, обновить данные до существующего документа. Если ни один подобный документ не создаст новую запись.

См. Приведенный ниже код. Проблема в том, что в большинстве случаев «findExistingDoc» возвращает false, но к моменту, когда вызов пытается создать новый документ, аналогичный документ уже создан предыдущим вызовом.

Пожалуйста, помогите с оптимальным решением для решения этой проблемы.

self.findExistingDoc(function(err, doc){ // Check if a similar doc already exist 

    if (!doc){ 
     console.log ("NO existing doc");      

     self.save(function(err, doc) { 
      if (err) { 
       console.error ("DB Error while creating new doc : " + JSON.stringify(err)); 
      } else { 
       console.log ("New document created"); 
      } 
     }); 
    } else { 
     console.log ("existing doc");     

     var qry = {"name": req.s_name, "class": req.s_class}; 
     self.model("Collection").findOneAndUpdate (qry, {$addToSet: {"data": req.body.s_data}}, {safe: true, upsert: true}, function (err, album) { 
      if (err) { 
       console.error ("DB Error while adding data to existing doc : " + JSON.stringify(err)); 
      } else { 
       console.log ("Data added to existing doc"); 
      } 
      callback(err, output); 
     }); 

    } 
}); 
+0

Что такое строение док и ваш s_data от тела –

+0

{ s_name: "Джон", s_class: "Pre-Univ", данных: [{d1: "XYZ"}, {d1 : "ABC"}] } – Ananth

ответ

0

Решение моей проблемы после некоторых поисковых запросов. Благодаря новому оператору $ setOnInsert, который представлен в mongodb v2.4.

var slug = getUniqueSlug("name"); 
var qry = {"name": req.s_name, "class": req.s_class}; 
var update = {"$addToSet": {"data": req.body.s_data}, "$setOnInsert": {"slug": slug}}; 
self.model("Collection").findAndModify (qry, update, {"safe": true, "upsert": true}); 
Смежные вопросы