2011-08-08 25 views
10

De acuerdo con CouchDB Wiki on PUT operations.¿Se está actualizando a granel una base de datos CouchDB sin un valor _rev por documento?

Para actualizar un documento existente, también emite una solicitud PUT. En este caso, el cuerpo JSON debe contener una propiedad _rev, que le permite a CouchDB saber en qué revisión están basadas las ediciones. Si la revisión del documento almacenado actualmente en la base de datos no coincide, se devuelve un error de conflicto 409.

Mi objetivo es llevar a cabo una actualización de bulk_docs:

curl -X POST [domain]/[couch db name]/_bulk_docs -H "Content-type: application/json" -d @[some document].json 

Mi flujo de trabajo es la siguiente:

  1. Mi datos están en una hoja de cálculo de Google Docs.
  2. que convertir los datos de hoja de cálculo para JSON por copiar y pegar en Mr. Data Converter
  3. utilizo CURL (como se muestra arriba) para añadir documentos/actualización

El problema es que la primera vez que añadir nuevos documentos, todo funciona perfectamente, sin embargo, la próxima vez que publico los mismos documentos, obtengo un error de seguimiento para cada documento:

... {"id": "28", "error": "conflicto", "razón ":" Conflicto de actualización del documento ".} ...

¿Hay alguna manera de actualizar un documento existente sin incluir una propiedad _rev?

Respuesta

18

Por diseño, no puede actualizar un documento CouchDB a ciegas, solo puede intentar actualizar una revisión específica de un documento.

Para un único documento, puede usar un CouchDB update handler para ocultar esto al cliente, ya que un controlador de actualización pasará el documento existente (si existe), incluida su revisión.

Para una colección de documentos, cuando se utiliza _bulk_docs, puede agregar "new_edits": false que se inserte a la fuerza los conflictos en lugar de rechazo (aunque todavía tendrá que pasar una _rev, simplemente no tiene por qué ser la corriente uno).

Dicho todo esto, sería mejor seguir las reglas. Tome la revisión actual del documento que desea actualizar, intente actualizarlo, si obtiene un 409, obtenga la nueva versión, fusione según corresponda y actualice nuevamente.

+0

El controlador de actualización parece ser el camino a seguir para actualizar los datos. Será más rápido porque no tiene que descargar todos los documentos, fusionar el lado del cliente y subirlo nuevamente. ¡En su lugar, el manejador de actualizaciones puede hacer la fusión por usted con 1/3 de la actividad de la red! –

+0

@DobesVandermeer que no es universal. Como el controlador de actualizaciones no admite operaciones por lotes, esa es una solicitud por actualización/persistencia. Si necesita hacer más de 2-4 de ellos al mismo tiempo, realice operaciones por lotes porque generalmente se necesitan entre 2 y 4 solicitudes según las circunstancias, por ejemplo, para actualizar 10 documentos. Por supuesto, si usa '" new_edits ": falso' puede continuar/reemplazar lote en 1 solicitud, pero tenga en cuenta que' new_edits' es [destinado a ser utilizado por el replicador] (http://goo.gl/EFFofn))Un inconveniente es que no conserva el historial de revisión, me pregunto si eso podría interferir con la replicación ... –

+0

@DominykasMostauskis ah sí, buen punto. El OP podría querer hacer una descarga por lotes, calcular los nuevos valores y cargar lotes, que son menos transacciones en general. Mientras todo encaje en la memoria. –

Cuestiones relacionadas