2016-08-05 14 views
1

Ich möchte einen Datensatz erstellen, wenn nicht in der DB, so dass ich zuerst eine Abfrage ausführen, um diesen bestimmten Datensatz zu finden, und wenn nicht existiert, dann führen Sie eine Abfrage ausführen, um es zu erstellen.mongodb führen mehrere Abfragen gleichzeitig aus

Aber das Problem ist, wenn mehrere Anfragen zur gleichen Zeit mit gleichen Daten kommt. Alle Anfragen versuchen, diesen Datensatz zu finden, und weil er noch nicht erstellt wurde, übertreffen alle die erste Bedingung und werden in der Datenbank erstellt.

für ex. Ich habe "Start" und "Ende" -Felder in DB. Ich möchte nicht jeden Datensatz Überlappung Timing aufweist, so für sie führt zuerst ich Abfrage als unten:

db.slots.find({ 
    from: { 
     $lte: req.body.end 
    }, 
    to: { 
     $gte: req.body.from 
    } 
}) 

und wenn kein Datensatz existiert dann ausführen ich Abfrage erstellen, was ich reponse zurückzukehren, ohne den Schlitz zu schaffen.

Wenn zwei Anfragen zur selben Zeit mit der gleichen Slot-Zeit kommen, dann beide übergeben die erste Abfrage, da noch kein Datensatz erstellt wurde und dann beide erstellt werden, also möchte ich etwas wie eine "Sperre" implementieren.

Antwort

0

Sie können eine Funktion schreiben. und innerhalb der Funktion die Aufgabe ausführen. und mache die Funktion gleichzeitig. durch ein globales Versprechen.

var mypromise; 
function myfunction(){ 
if(mypromise) return mypromise; 

mypromise = new Promise(
    function (resolve, reject) { 
     ··· 
     resolve(value); // success 
     mypromise = false; 
    }); 
return mypromise; 

}

+0

ich nicht bekommen, wie es geht. kannst du bitte irgendeinen Beispielcode dafür geben? – Sachin

+0

Ich suche keine Lösung für einzelne Anfrage. Für einzelne Anfrage kann es ohne Versprechen gemacht werden. Im Falle einer Mehrfachanforderung wird dieser Codeblock ausgeführt, ohne dass eine Sperre für die Sammlung erstellt wird, und doppelte Datensätze werden erstellt. – Sachin

+0

Nein, der zweite Aufruf der Funktion wird das Ergebnis des ersten Aufrufs erhalten. – enRaiser