sql >> Base de Datos >  >> NoSQL >> MongoDB

Mongodb actualiza un número limitado de documentos

Según Sammaye, no parece que haya una forma "adecuada" de hacer esto. Mi solución fue crear un secuencia como se describe en el sitio de mongo y simplemente agregue un campo 'seq' a cada registro en mi colección. Ahora tengo un campo único que se puede ordenar de manera confiable para actualizar.

La clasificación confiable es importante aquí. Iba a ordenar el _id generado automáticamente, pero rápidamente me di cuenta de que el orden natural NO es lo mismo que el orden ascendente para los ObjectId (de esta página parece que el valor de la cadena tiene prioridad sobre el valor del objeto que coincide con el comportamiento que observé en las pruebas). Además, es muy posible que un registro se reubique en el disco, lo que hace que el orden natural no sea confiable para la clasificación.

Entonces, ahora puedo consultar el registro con el 'seq' más pequeño que NO se ha actualizado para obtener un punto de partida inclusivo. A continuación, busco registros con 'seq' mayor que mi punto de partida y omito (es importante omitir ya que 'seq' puede ser escaso si elimina documentos, etc.) la cantidad de registros que quiero actualizar. Ponga un límite de 1 en esa consulta y obtendrá un punto final no inclusivo. Ahora puedo emitir una actualización con una consulta de 'actualizado' =0, 'seq'>=mi punto de partida y

Estos son los pasos nuevamente:

  1. cree una secuencia de incremento automático usando findAndModify
  2. agregue un campo a su colección que use la secuencia de incremento automático
  3. consulta para encontrar un punto de partida adecuado:db.xx.find({actualizado:0}).sort({seq:1}).limit(1)
  4. consulta para encontrar un punto final adecuado:db.xx.find({ seq:{ $gt:startSeq }}).sort({ seq:1 }).skip(updateCount).limit(1)
  5. actualice la colección usando los puntos de inicio y fin:db.xx.update({ actualizado:0, seq:{ $gte:startSeq }, seq:{ $lt:endSeq }, $aislado:1}, { actualizado :1 },{ multi:verdadero })

Bastante doloroso, pero hace el trabajo.