sql >> Database >  >> NoSQL >> MongoDB

Oplossing voor Bulk FindAndModify in MongoDB

Zoals je al zei, is er momenteel geen schone manier om te doen wat je wilt. De beste aanpak op dit moment voor operaties zoals degene die u nodig heeft, is deze:

  1. Lezer selecteert X documenten met de juiste limiet en sortering
  2. Reader markeert de documenten die worden geretourneerd door 1) met zijn eigen unieke lezer-ID (e.g. update({_id:{$in:[<result set ids>]}, state:"available", $isolated:1}, {$set:{readerId:<your reader's ID>, state:"processing"}}, false, true) )
  3. Reader selecteert alle documenten die zijn gemarkeerd als verwerking en met een eigen lezer-ID. Op dit punt is het gegarandeerd dat u exclusieve toegang hebt tot de resulterende set documenten.
  4. Bied de resultatenset van 3) aan voor uw verwerking.

Houd er rekening mee dat dit zelfs werkt in situaties met veel gelijktijdigheid, aangezien een lezer nooit documenten kan reserveren die niet al door een andere lezer zijn gereserveerd (merk op dat stap 2 alleen momenteel beschikbare documenten kan reserveren en dat schrijven atomair is). Ik zou ook een tijdstempel met reserveringstijd toevoegen als je reserveringen wilt time-outen (bijvoorbeeld voor scenario's waarin lezers kunnen crashen/mislukken).

EDIT:Meer details:

Alle schrijfbewerkingen kunnen af ​​en toe leiden tot wachtende bewerkingen als het schrijven relatief lang duurt. Dit betekent dat stap 2) mogelijk niet alle documenten ziet die zijn gemarkeerd met stap 1), tenzij u de volgende stappen onderneemt:

  • Gebruik een geschikte "w" (write concern) waarde, wat 1 of hoger betekent. Dit zorgt ervoor dat de verbinding waarop de schrijfbewerking wordt aangeroepen, wacht tot deze is voltooid, ongeacht of deze wordt opgeleverd.
  • Zorg ervoor dat u de read in stap 2 op dezelfde verbinding (alleen relevant voor replicasets met slaveOk ingeschakelde reads) of thread uitvoert, zodat ze gegarandeerd opeenvolgend zijn. Het eerste kan in de meeste stuurprogramma's worden gedaan met de methoden "requestStart" en "requestDone" of vergelijkbaar (Java-documentatie hier ).
    • Voeg de $isolated-vlag toe aan uw multi-updates om ervoor te zorgen dat deze niet kan worden verweven met andere schrijfbewerkingen.

Zie ook opmerkingen voor discussie over atomiciteit/isolatie. Ik nam ten onrechte aan dat multi-updates geïsoleerd waren. Dat zijn ze niet, of in ieder geval niet standaard.




  1. MongoDB:miljarden documenten in een collectie

  2. Hoe kan ik mangoestmodellen delen tussen 2 apps?

  3. Facebook-paspoort met JWT

  4. Laravel + predis + Redis cluster - VERPLAATST / geen verbinding naar 127.0.0.1:6379