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

Mongodb aktualizuje omezený počet dokumentů

Podle Sammaye to nevypadá, že by existoval „správný“ způsob, jak to udělat. Mým řešením bylo vytvořit sekvence, jak je uvedeno na mongo webu a jednoduše přidat pole 'seq' ke každému záznamu v mé sbírce. Nyní mám jedinečné pole, které lze spolehlivě seřadit a aktualizovat.

Zde je důležité spolehlivě třídit. Chtěl jsem jen třídit podle automaticky generovaného _id, ale rychle jsem si uvědomil, že přirozené pořadí NENÍ totéž jako vzestupné pořadí pro ObjectId (z tuto stránku vypadá to, že hodnota řetězce má přednost před hodnotou objektu, která odpovídá chování, které jsem pozoroval při testování). Také je zcela možné, aby byl záznam na disku přemístěn, což činí přirozený řád nespolehlivým pro třídění.

Nyní se tedy mohu dotazovat na záznam s nejmenším „seq“, který již NEBYL aktualizován, aby získal inkluzivní výchozí bod. Dále se zeptám na záznamy s 'seq' větším než je můj výchozí bod a přeskočím (je důležité přeskočit, protože 'seq' může být řídké, pokud odstraníte dokumenty atd...) počet záznamů, které chci aktualizovat. Dejte na tento dotaz limit 1 a máte nezahrnutý koncový bod. Nyní mohu vydat aktualizaci s dotazem 'updated' =0, 'seq'>=můj počáteční bod a

Zde jsou znovu kroky:

  1. vytvořte sekvenci automatického zvyšování pomocí findAndModify
  2. přidejte do své sbírky pole, které používá sekvenci automatického přírůstku
  3. dotaz k nalezení vhodného výchozího bodu:db.xx.find({ updated:0 }).sort({ seq:1 }).limit(1)
  4. dotaz k nalezení vhodného koncového bodu:db.xx.find({ seq:{ $gt:startSeq }}).sort({ seq:1 }).skip(updateCount).limit(1)
  5. aktualizujte kolekci pomocí počátečního a koncového bodu:db.xx.update({ updated:0, seq:{ $gte:startSeq }, seq:{ $lt:endSeq }, $isolated:1}, { updated :1 },{ multi:true })

Docela bolestivé, ale dá to práci.




  1. Jak přidat data do pole ve schématu Mongoose

  2. Vypočítejte průměrnou hodnotu dokumentu mongodb

  3. mongo - cli klesá s Failed to mlock:Nelze alokovat zamčenou paměť

  4. Dotaz na hodnotu posledního pole