sql >> Databáze >  >> NoSQL >> MongoDB

Řešení pro hromadné FindAndModify v MongoDB

Jak jste zmínil, v současné době neexistuje žádný čistý způsob, jak dělat to, co chcete. Nejlepší přístup v tuto chvíli pro operace, jako je ten, který potřebujete, je tento:

  1. Aplikace Reader vybere X dokumentů s příslušným limitem a řazením
  2. Aplikace Reader označí dokumenty vrácené 1 svým vlastním jedinečným ID čtečky (e.g. update({_id:{$in:[<result set ids>]}, state:"available", $isolated:1}, {$set:{readerId:<your reader's ID>, state:"processing"}}, false, true) )
  3. Aplikace Reader vybere všechny dokumenty označené jako zpracovávané a se svým vlastním ID čtečky. V tomto okamžiku je zaručeno, že máte výhradní přístup k výsledné sadě dokumentů.
  4. Nabídněte sadu výsledků z bodu 3) ke zpracování.

Všimněte si, že to funguje i ve vysoce souběžných situacích, protože čtenář si nikdy nemůže rezervovat dokumenty, které již nebyly rezervovány jiným čtenářem (všimněte si, že krok 2 může rezervovat pouze aktuálně dostupné dokumenty a zápisy jsou atomické). Přidal bych také časové razítko s časem rezervace, pokud chcete mít možnost vypršení časového limitu rezervací (například pro scénáře, kdy mohou čtečky selhat/selhat).

EDIT:Další podrobnosti:

Všechny operace zápisu mohou příležitostně přinést nevyřízené operace, pokud zápis trvá relativně dlouho. To znamená, že v kroku 2) se nemusí zobrazit všechny dokumenty označené krokem 1), pokud neprovedete následující kroky:

  • Použijte vhodnou hodnotu „w“ (zájem o zápis), což znamená 1 nebo vyšší. To zajistí, že připojení, na kterém je vyvolána operace zápisu, bude čekat na její dokončení bez ohledu na to, zda se podvolí.
  • Ujistěte se, že čtení v kroku 2 provádíte na stejném připojení (relevantní pouze pro replikasety s povoleným čtením slaveOk) nebo vláknu, aby bylo zaručeno, že budou sekvenční. První možnost lze ve většině ovladačů provést pomocí metod „requestStart“ a „requestDone“ nebo podobně (dokumentace Java zde ).
    • Přidejte do více aktualizací příznak $isolated, abyste zajistili, že je nelze prokládat jinými operacemi zápisu.

Viz také komentáře k diskusi týkající se atomicity/izolace. Nesprávně jsem předpokládal, že vícenásobné aktualizace byly izolované. Nejsou, nebo alespoň ne ve výchozím nastavení.




  1. Jak mohu zakázat zprávy protokolu MongoDB v konzole?

  2. [Chyba:nepodařilo se připojit k [localhost:27017]] z NodeJS do mongodb

  3. MongoDB:Server má varování při spuštění ''Řízení přístupu není povoleno pro databázi''

  4. jak používat $lookup stage v Javě s jarními daty mongodb?