sql >> Databasteknik >  >> NoSQL >> MongoDB

Lösning för Bulk FindAndModify i MongoDB

Som du nämner finns det för närvarande inget rent sätt att göra vad du vill. Det bästa tillvägagångssättet just nu för operationer som den du behöver är detta:

  1. Läsaren väljer X dokument med lämplig gräns och sortering
  2. Reader markerar dokumenten som returneras med 1) med sitt eget unika läsar-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 väljer alla dokument som är markerade som bearbetade och med sitt eget läsar-ID. Vid det här laget är det garanterat att du har exklusiv tillgång till den resulterande uppsättningen av dokument.
  4. Erbjud resultatuppsättningen från 3) för din bearbetning.

Observera att detta till och med fungerar i mycket samtidiga situationer eftersom en läsare aldrig kan reservera dokument som inte redan reserverats av en annan läsare (observera att steg 2 endast kan reservera för närvarande tillgängliga dokument, och skrivningar är atomära). Jag skulle lägga till en tidsstämpel med reservationstid också om du vill kunna tidsgränsa reservationer (till exempel för scenarier där läsare kan krascha/misslyckas).

EDIT:Mer information :

Alla skrivoperationer kan ibland ge efter för väntande operationer om skrivningen tar relativt lång tid. Det betyder att steg 2) kanske inte ser alla dokument markerade av steg 1) om du inte vidtar följande steg:

  • Använd ett lämpligt "w"-värde (skriv oro), vilket betyder 1 eller högre. Detta säkerställer att anslutningen som skrivoperationen anropas på väntar på att den ska slutföras oavsett om den ger efter.
  • Se till att du gör läsningen i steg 2 på samma anslutning (endast relevant för replikuppsättningar med slaveOk-aktiverade läsningar) eller tråd så att de garanterat är sekventiella. Det förra kan göras i de flesta drivrutiner med metoderna "requestStart" och "requestDone" eller liknande (Java-dokumentation här ).
    • Lägg till flaggan $isolated i dina flera uppdateringar för att säkerställa att den inte kan interfolieras med andra skrivoperationer.

Se även kommentarer för diskussion angående atomicitet/isolering. Jag antog felaktigt att flera uppdateringar var isolerade. De är inte, eller åtminstone inte som standard.




  1. Spark HBase Connector – ett år i översyn

  2. Matcha ett arrayfält som innehåller valfri kombination av den tillhandahållna arrayen i MongoDB

  3. Hur man ställer in/hämtar Pandas dataramar till Redis med pyarrow

  4. mongodb $addToSet till ett icke-arrayfält vid uppdatering vid upsert