sql >> Database teknologi >  >> NoSQL >> MongoDB

Mongodb opdaterer begrænset antal dokumenter

Per Sammaye, det ser ikke ud til, at der er en "korrekt" måde at gøre dette på. Min løsning var at oprette en sekvens som beskrevet på mongo-webstedet og blot tilføje et 'seq'-felt til hver post i min samling. Nu har jeg et unikt felt, som er pålideligt sorterbart at opdatere på.

Pålidelig sortering er vigtig her. Jeg skulle bare sortere på det autogenererede _id, men jeg indså hurtigt, at naturlig rækkefølge IKKE er det samme som stigende rækkefølge for ObjectId's (fra denne side det ser ud til, at strengværdien har forrang over objektværdien, som matcher den adfærd, jeg observerede i testen). Det er også fuldt ud muligt for en post at blive flyttet til disk, hvilket gør den naturlige rækkefølge upålidelig til sortering.

Så nu kan jeg forespørge for posten med den mindste 'seq', som IKKE allerede er blevet opdateret for at få et inkluderende udgangspunkt. Dernæst forespørger jeg efter poster med 'seq' større end mit udgangspunkt og springer over (det er vigtigt at springe over, da 'seq'en kan være sparsom, hvis du fjerner dokumenter osv...) antallet af poster jeg vil opdatere. Sæt en grænse på 1 på den forespørgsel, og du har et ikke-inkluderende slutpunkt. Nu kan jeg udstede en opdatering med en forespørgsel på 'opdateret' =0, 'seq'>=mit udgangspunkt og

Her er trinene igen:

  1. opret en sekvens med automatisk stigning ved hjælp af findAndModify
  2. tilføj et felt til din samling, som bruger den automatiske stigningssekvens
  3. forespørg for at finde et passende udgangspunkt:db.xx.find({ updated:0 }).sort({ seq:1 }).limit(1)
  4. forespørgsel for at finde et passende slutpunkt:db.xx.find({ seq:{ $gt:startSeq }}).sort({ seq:1 }).skip(updateCount).limit(1)
  5. opdater samlingen ved hjælp af start- og slutpunkterne:db.xx.update({ updated:0, seq:{ $gte:startSeq }, seq:{ $lt:endSeq }, $isolated:1}, { updated :1 },{ multi:sand })

Temmelig smertefuldt, men det får arbejdet gjort.




  1. Beregn en score fra et eksisterende felt med betingelser

  2. Brug af redis med node.js (express)

  3. Hvordan implementerer man oAuth2 sammen med JWT-godkendelse i spring boot?

  4. MongoDB:Kontrollerer, om indlejret array indeholder sub-array