MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Mongodb atualiza número limitado de documentos


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:
  1. criar uma sequência de incremento automático usando findAndModify
  2. adicione um campo à sua coleção que use a sequência de incremento automático
  3. consulta para encontrar um ponto de partida adequado:db.xx.find({ atualizado:0 }).sort({ seq:1 }).limit(1)
  4. consulta para encontrar um ponto de extremidade adequado:db.xx.find({ seq:{ $gt:startSeq }}).sort({ seq:1 }).skip(updateCount).limit(1)
  5. 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.