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

Mongodb aggiorna un numero limitato di documenti

Per Sammaye, non sembra che ci sia un modo "corretto" per farlo. La mia soluzione era creare un sequenza come descritto sul sito mongo e aggiungi semplicemente un campo "seq" a ogni record nella mia raccolta. Ora ho un campo univoco su cui è possibile eseguire l'ordinamento in modo affidabile.

Ordinabile in modo affidabile è importante qui. Stavo solo per ordinare l'_id generato automaticamente, ma mi sono subito reso conto che l'ordine naturale NON è lo stesso dell'ordine crescente per ObjectId (da questa pagina sembra che il valore della stringa abbia la precedenza sul valore dell'oggetto che corrisponde al comportamento che ho osservato durante il test). Inoltre, è del tutto possibile che un record venga riposizionato su disco, il che rende inaffidabile l'ordine naturale per l'ordinamento.

Quindi ora posso interrogare il record con il "seq" più piccolo che NON è già stato aggiornato per ottenere un punto di partenza inclusivo. Quindi interrogo i record con 'seq' maggiore del mio punto di partenza e salto (è importante saltare poiché 'seq' potrebbe essere scarso se si rimuovono documenti, ecc...) il numero di record che voglio aggiornare. Metti un limite di 1 su quella query e hai un endpoint non inclusivo. Ora posso emettere un aggiornamento con una query di 'updated' =0, 'seq'>=il mio punto di partenza e

Ecco di nuovo i passaggi:

  1. crea una sequenza di incremento automatico utilizzando findAndModify
  2. aggiungi un campo alla tua raccolta che utilizza la sequenza di incremento automatico
  3. interroga per trovare un punto di partenza adatto:db.xx.find({ aggiornato:0 }).sort({ seq:1 }).limit(1)
  4. interroga per trovare un endpoint adatto:db.xx.find({ seq:{ $gt:startSeq }}).sort({ seq:1 }).skip(updateCount).limit(1)
  5. aggiorna la raccolta utilizzando i punti di inizio e fine:db.xx.update({ aggiornato:0, seq:{ $gte:startSeq }, seq:{ $lt:endSeq }, $isolated:1}, { aggiornato :1 },{ multi:true })

Abbastanza doloroso ma fa il suo lavoro.