2016-06-28 3 views
0

Для этого проекта MEAN Stack, я хотел бы сохранить в тех же документах коллекции с:сохранить синхронную (не дублировать) информацию в асинхронном процессе

  • различных типов
  • уникальные хронологический номером для каждого типа.

пример:

{ID: 1, тип: 'а', хроно: 1}

{ID: 2, тип: 'B', хроно: 1}

{ID: 3, тип: 'B', хроно: 2}

{ID: 4, тип: 'а', хроно: 2}

{ID: 5, тип: 'B', хроно : 3}

...

На переднем конце, я использовать цикл

for (var i++; i < type.length; i++) // lets say Document type = ["a", "b"] 

     for (var j++; j< 100; j++) // Creates 100 documents 

     // Front end service request directing to the NodeJS Server to create a document 
serverDocument.createDocument(dataS).success(function(dataR){ 
         counterDOC++; 
$scope.documentID= dataR._id; 
} 

nodeJS Сервер ищет последний Chrono Номер в БД для выбранного типа документа и добавить 1.

doc = new db.Document (req.body); // req.body is for example {type: 'a'} 
doc.save(); 

getChrono (doc); // home made function 

ГЭТ функция Chrono:

var getChrono = function(doc){ 

    var config= 
     { 

      type : doc.type, 

     } 

    query = db.Document.findOne(config).sort({$natural:-1}); 

    query.exec(function (err, chrn){ 

     doc.chrono = 1; 

     if (chrn != null) 

      if(chrn.chrono != null) 

      doc.chrono= chrn.chrono+1; 

     doc.update(); 

    }); 

И в результате что-то подобное тому, что:

{ID: 1, тип: 'а', хроно: 1}

{ID: 2, тип: 'а', хроно: 1}

{ID: 3, тип: 'а', хроно: 1}

{ID: 4, тип: 'а', хроно: 1}

{ID: 5, тип: 'а', chrono: 2} ... Конечно, идентификатор объекта уникален, но хронологические номера не уникальны для типа документа.

Насколько я понимаю, эта информация еще не сохранена в БД при запуске следующего запроса. Поэтому последний номер хронографа в БД не является последним номером хронографа в действительности.

Может ли кто-нибудь есть метод решения этой проблемы? я не хочу синхронное решения на стороне переднего конца, и логично было бы иметь на сторону сервера для управления хро номеру

+0

Вы будете нуждаться в очереди, чтобы обработать ваши детали в синхронизации пути. – Dieterg

+0

Привет, Дитер, я не хочу делать это на стороне фронта, потому что проблема с получением 2 пользователями одной и той же операции может привести к ошибке. И я понятия не имею, как сделать это на сервере. Возможно я пропустил функцию? – Alex

+0

Вы также можете добавить эту функцию на сервер. : - – Dieterg

ответ

0

Вы можете save док после приращения chrono

Так ниже saveDoc будете работать ,

function saveDoc(docBody,callback){ 
    var query = db.Document.findOne({type:docBody.type}).sort({chrono:-1});// I guess $natural is not that reliable 
    query.exec(function (err, chrn){ 
     if(err) 
     return callback(err); 
     docBody.chrono = chrn && chrn.chrono != null?chrn.chrono+1:1; 

     var doc = new db.Document(docBody); // Doc created here after getting chrono 
     doc.save(callback); 
    }); 
} 

Затем вызовите функцию с телом запроса

saveDoc(req.body,function(){ 
console.log('saved'); 
}); 
+0

Привет JagsSparrow .. Я реализовал вашу функцию в программе, но результат «тот же». Номер chono не учитывается, так как это должно быть – Alex

+0

Похоже, что компьютер занимает слишком много времени, чтобы сохранить информация сравнивается с чтением и может считывать 3/4 входа, прежде чем она сможет сохранить новые документы. – Alex

Смежные вопросы