De acordo com Sammaye, não parece haver uma maneira "adequada" de fazer isso. Minha solução foi criar um sequência conforme descrito no site do mongo e simplesmente adicione um campo 'seq' a cada registro em minha coleção. Agora eu tenho um campo exclusivo que é classificável de forma confiável para atualizar.
A classificação confiável é importante aqui. Eu ia apenas classificar o _id gerado automaticamente, mas rapidamente percebi que a ordem natural NÃO é o mesmo que a ordem crescente para ObjectIds (de esta página parece que o valor da string tem precedência sobre o valor do objeto que corresponde ao comportamento que observei no teste). Além disso, é totalmente possível que um registro seja realocado no disco, o que torna a ordem natural não confiável para classificação.
Então agora posso consultar o registro com o menor 'seq' que ainda NÃO foi atualizado para obter um ponto de partida inclusivo. Em seguida, consulto registros com 'seq' maior que meu ponto de partida e pulo (é importante pular, pois o 'seq' pode ser esparso se você remover documentos, etc...) o número de registros que desejo atualizar. Coloque um limite de 1 nessa consulta e você terá um endpoint não inclusivo. Agora posso emitir uma atualização com uma consulta de 'updated' =0, 'seq'>=meu ponto de partida e
Aqui estão os passos novamente:
- criar uma sequência de incremento automático usando findAndModify
- adicione um campo à sua coleção que use a sequência de incremento automático
- consulta para encontrar um ponto de partida adequado:db.xx.find({ atualizado:0 }).sort({ seq:1 }).limit(1)
- consulta para encontrar um ponto de extremidade adequado:db.xx.find({ seq:{ $gt:startSeq }}).sort({ seq:1 }).skip(updateCount).limit(1)
- atualize a coleção usando os pontos inicial e final:db.xx.update({ updated:0, seq:{ $gte:startSeq }, seq:{ $lt:endSeq }, $isolated:1}, { updated :1 },{ multi:verdadeiro })
Bastante doloroso, mas faz o trabalho.