sql >> Database >  >> NoSQL >> MongoDB

Mongodb update beperkt aantal documenten

Volgens Sammaye lijkt het er niet op dat er een "juiste" manier is om dit te doen. Mijn oplossing was om een ​​volgorde zoals beschreven op de mongo-site en voeg eenvoudig een 'seq'-veld toe aan elk record in mijn verzameling. Nu heb ik een uniek veld dat betrouwbaar kan worden gesorteerd om op te updaten.

Betrouwbaar sorteerbaar is hierbij belangrijk. Ik wilde gewoon sorteren op de automatisch gegenereerde _id, maar ik realiseerde me al snel dat natuurlijke volgorde NIET hetzelfde is als oplopende volgorde voor ObjectId's (van deze pagina het lijkt erop dat de tekenreekswaarde voorrang heeft op de objectwaarde die overeenkomt met het gedrag dat ik tijdens het testen heb waargenomen). Het is ook heel goed mogelijk dat een record op schijf wordt verplaatst, waardoor de natuurlijke volgorde onbetrouwbaar wordt voor het sorteren.

Dus nu kan ik het record opvragen met de kleinste 'seq' die nog NIET is bijgewerkt om een ​​inclusief startpunt te krijgen. Vervolgens vraag ik naar records met 'seq' groter dan mijn startpunt en sla (het is belangrijk om over te slaan omdat de 'seq' schaars kan zijn als u documenten verwijdert, enz...) het aantal records dat ik wil bijwerken. Zet een limiet van 1 op die query en je hebt een niet-inclusief eindpunt. Nu kan ik een update uitgeven met een query van 'updated' =0, 'seq'>=mijn startpunt en

Hier zijn de stappen nogmaals:

  1. maak een automatisch oplopende reeks met findAndModify
  2. voeg een veld toe aan uw verzameling dat gebruikmaakt van de volgorde voor automatisch verhogen
  3. vraag om een ​​geschikt startpunt te vinden:db.xx.find({ updated:0 }).sort({ seq:1 }).limit(1)
  4. zoekopdracht om een ​​geschikt eindpunt te vinden:db.xx.find({ seq:{ $gt:startSeq }}).sort({ seq:1 }).skip(updateCount).limit(1)
  5. werk de verzameling bij met de begin- en eindpunten:db.xx.update({ updated:0, seq:{ $gte:startSeq }, seq:{ $lt:endSeq }, $isolated:1}, { updated :1 },{ multi:true })

Best pijnlijk, maar het klaart de klus.




  1. Update met expressie in plaats van waarde

  2. Referentiefout wordt niet gegenereerd door MongoDB-callback

  3. Het unieke kenmerk van SailsJS en Mongo wordt genegeerd

  4. Mongodb - moet _id wereldwijd uniek zijn bij sharding