2009-04-26 16 views
8

Si tengo un archivo JSON que se ve algo como esto:importación de sofá DB

{"name":"bob","hi":"hello"} 
{"name":"hello","hi":"bye"} 

¿Existe una opción para importar esto en couchdb?

Respuesta

2

Ese objeto JSON no será aceptado por CouchDB. Para almacenar todos los datos con una sola solicitud de servidor, use:

{ 
    "people": 
    [ 
     { 
     "name":"bob", 
     "hi":"hello" 
     }, 
     { 
     "name":"hello", 
     "hi":"bye" 
     } 
    ] 
} 

Como alternativa, envíe una solicitud de CouchDB diferente para cada fila.

Importe el archivo en CouchDB desde la línea de comandos usando cURL:

curl -vX POST https://user:[email protected]:1234/database \ 
    -d @- -# -o output -H "Content-Type: application/json" < file.json 
0

http://github.com/zaphar/db-couchdb-schema/tree/master

Mi DB :: :: CouchDB módulo de esquema tiene una secuencia de comandos para ayudar con la carga de una serie de documentos en una base de datos CouchDB. El script couch_schema_tool.pl acepta un archivo como argumento y carga todos los documentos en ese archivo en la base de datos. Sólo hay que poner cada documento en una matriz de este modo:

[ { "name": "bob", "Hola": "hola"}, { "name": "hola", "Hola": "bye "} ]

Se cargarán en la base de datos por usted. Aunque no he probado mi último código contra la última versión de CouchDB, si lo usa y se rompe, hágamelo saber. Probablemente tenga que cambiar algo para adaptarse a los nuevos cambios de API.

Jeremy

5

Si está en Linux, se podría escribir un script de shell rápida para publicar el contenido de los archivos JSON válidas para Couch.

Para probar sofá hice algo como esto:

cat myFile.json | POST -sS "http://myDB.couchone.com/testDB" -c "application/json" 

myFile.json tiene el contenido JSON que quería importar a la base de datos.

Otra alternativa, si no te gusta la línea de comandos o no está usando Linux, y prefiere una interfaz gráfica de usuario, puede utilizar una herramienta como RESTClient

+0

Para todos los que buscan "POST": es parte del paquete libwww-perl. – ofrommel

3

Sí, esto no es válida ... JSON

Para importar objetos JSON-yo uso rizo (http://curl.haxx.se):

curl -X PUT -d @my.json http://admin:[email protected]:5984/db_name/doc_id 

donde my.json es un archivo JSON a objetos es en. Por supuesto, usted puede poner su JSON a objetos directamente en couchdb (sin un archivo), así:

curl -X PUT -d '{"name":"bob","hi":"hello"}' http://admin:[email protected]:5984/db_name/doc_id 

Si usted no tiene un doc_id, puede pedir couchdb para ello:

curl -X GET http://127.0.0.1:5984/_uuids?count=1 
+0

Para cualquier otra persona que obtenga un error sobre Content-Type en el primer ejemplo aquí, intente esto: 'curl -X POST -d @ data.json http://127.0.0.1:5984/database/_bulk_docs -H 'Content-Type : application/json'' –

+0

Downvoted porque creo que la pregunta es para múltiples documentos y no solo uno. Creo que estás respondiendo cómo importar solo un documento. –

6

a partir de la respuesta @Millhouse pero con múltiples documentos en mi archivo solía

cat myFile.json | lwp-request -m POST -sS "http://localhost/dbname/_bulk_docs" -c "application/json" 

POST es un alias de lwp-request pero POST hace no parece funcionar en Debian. Si usa lwp-request, necesita establecer el método con -m como se indica arriba.

El _bulk_docs posterior permite subir varios documentos a la vez.

http://wiki.apache.org/couchdb/HTTP_Bulk_Document_API

+0

la api bulk_doc debe tener todos los documentos anidados dentro de un objeto '{" docs ": [documents]}'. –

2

No es mi solución, pero me pareció que para resolver mi problema:

Una forma sencilla de exportar una base de datos CouchDB a un archivo, es mediante la ejecución del siguiente comando Curl en la ventana de terminal:

curl -X GET http://127.0.0.1:5984/[mydatabase]/_all_docs\?include_docs\=true > /Users/[username]/Desktop/db.json 

siguiente paso es modificar el archivo JSON exportado a parecerse a algo como el siguiente (nota _ID):

{ 
    "docs": [ 
     {"_id": "0", "integer": 0, "string": "0"}, 
     {"_id": "1", "integer": 1, "string": "1"}, 
     {"_id": "2", "integer": 2, "string": "2"} 
    ] 
} 

El bit principal que debe observar es agregar los documentos en el bloque de código "documentos". Una vez hecho esto se puede ejecutar el siguiente comando Curl para importar los datos a una base de datos CouchDB:

curl -d @db.json -H "Content-type: application/json" -X POST http://127.0.0.1:5984/[mydatabase]/_bulk_docs 

Duplicación de una base de datos de Si desea duplicar una base de datos de un servidor a otro. Ejecute el siguiente comando:

curl -H 'Content-Type: application/json' -X POST http://localhost:5984/_replicate -d ' {"source": "http://example.com:5984/dbname/", "target": "http://[email protected]:5984/dbname/"}' 

Post original: http://www.greenacorn-websolutions.com/couchdb/export-import-a-database-with-couchdb.php

2

Probablemente un poco tarde para contestar. Pero si usted puede usar Python que se puede utilizar el módulo de couchdb para hacerlo:

import couchdb 
import json 
couch = couchdb.Server(<your server url>) 
db = couch[<your db name>] 
with open(<your file name>) as jsonfile: 
    for row in jsonfile: 
     db_entry = json.load(row) 
     db.save(db_entry) 

que creó el script en Python para hacer eso (Como no pude encontrar uno en Internet).

El guión completo está aquí::

http://bitbucket.org/tdatta/tools/src/

(nombre -> jsonDb_to_Couch.PY)

Si descarga el repositorio completo y:

  1. texto reemplazar todos los "_id" en los archivos JSON para "id"

  2. Ejecutar hacer load_dbs

Crearía 4 bases de datos en su instalación de sofá local

Espero que ayude a los novatos (como yo)

+1

Creo que se supone que su código tiene los siguientes cambios: 'couch = couchdb.server ()' url faltante 'con abrir ()' cerrar paréntesis en lugar de paréntesis 'db_entry = json.loads (fila)' cargas en lugar de carga –

+0

Gracias Jared. Se corrigió en la publicación original. – Tanmay

Cuestiones relacionadas