2016-06-28 20 views
0

Für dieses Projekt MEAN Stapel, ich möchte mit der gleichen Sammlung von Dokumenten speichern:synchron speichern (nicht duplizieren) Informationen in einem asynchronen Prozess

  • verschiedene Arten
  • eindeutige laufende Nummer pro Typ.

Beispiel:

{ID: 1, Typ: 'a', chrono: 1}

{ID: 2, Typ: 'b', chrono: 1}

{ID: 3, Typ: 'b', chrono: 2}

{ID: 4, Typ: 'a', chrono: 2}

{ID: 5, Typ: 'b', chrono : 3}

...

Am vorderen Ende, verwende ich eine Schleife

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; 
} 

Der NodeJS Server ist für die letzte Chrono Nummer in der DB für den ausgewählten Typen des Dokuments suchen und hinzufügen 1.

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

getChrono (doc); // home made function 

Die Chrono-Funktion erhalten:

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(); 

    }); 

Und das Ergebnis ist etwas ähnlich wie:

{ID: 1, Typ: 'a', chrono: 1}

{ID: 2, Typ: 'a', chrono: 1}

{ID: 3, Typ: 'a', chrono: 1}

{ID: 4, Typ: 'a', chrono: 1}

{ID: 5, Typ: 'a', chrono: 2} ... Natürlich ist die Objekt-ID eindeutig, aber die chronologischen Zahlen sind für einen Dokumenttyp nicht eindeutig.

Ich verstehe, dass die Informationen noch nicht in DB gespeichert sind, wenn die nächste Anfrage gestartet wird. Daher ist die 'letzte Chrono-Nummer' in der DB nicht die letzte Chrono-Nummer in der Realität.

Kann jemand eine Methode, um dieses Problem zu lösen? ich will keine Synchronlösung auf der Vorderseite Ende und es wäre logisch, die Server-Seite haben CHRONO Anzahl

+0

Sie eine Warteschlange benötigen Ihre Artikel in einem Sync-Art und Weise zu verarbeiten. – Dieterg

+0

Hallo Dieterg, ich möchte es nicht auf der Frontendseite machen, weil das Problem, 2 User zu bekommen, die die gleiche Operation machen, zu einem Bug führen könnte. Und ich habe keine Ahnung, wie ich es auf der Serverseite machen kann Ich vermisse eine Funktion? – Alex

+0

Sie können diese Funktionalität auch auf dem Server hinzufügen. : - – Dieterg

Antwort

0

Sie können chrono

save doc zu verwalten

So unter saveDoc nach Inkrementieren arbeiten .

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); 
    }); 
} 

Dann rufen Sie Funktion mit Anfrage Körper

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

Hallo JagsSparrow .. Ich habe Ihre Funktion in das Programm implementiert, aber das Ergebnis ist das "gleiche" Die Chono-Nummer wird nicht berücksichtigt, wie es sein sollte – Alex

+0

Es sieht aus wie der Computer viel zu viel Zeit, um die zu speichern Informationen vergleichen zu lesen und es kann 3/4 Eingaben lesen, bevor es tatsächlich neue Dokumente speichern kann. – Alex