2009-04-26 5 views
8

Wenn ich eine JSON-Datei haben, die etwa wie folgt aussieht:Import JSON-Datei auf Couch DB-

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

Gibt es eine Möglichkeit, dies in couchdb zu importieren?

Antwort

2

Dieses JSON-Objekt wird von CouchDB nicht akzeptiert. Um alle Daten mit einer einzigen Serveranforderung zu speichern, verwenden Sie:

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

Alternativ können Sie für jede Zeile eine andere CouchDB-Anforderung senden.

Importieren Sie die Datei in CouchDB von der Kommandozeile mit 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

Meine DB :: CouchDB :: Schema-Modul verfügt über ein Skript mit dem Laden eine Reihe von Dokumenten zu helfen, in eine CouchDB Datenbank. Das Skript "coach_schema_tool.pl" akzeptiert eine Datei als Argument und lädt alle Dokumente in dieser Datei in die Datenbank. Einfach jedes Dokument in ein Array wie folgt:

[ { "name": "bob", "hallo": "Hallo"}, { "name": "Hallo", "hallo": "bye "} ]

Es wird sie in die Datenbank für Sie laden. Kleiner Vorbehalt, obwohl ich meinen neuesten Code nicht gegen CouchDBs neueste getestet habe, also wenn Sie es benutzen und es bricht dann lassen Sie es mich wissen. Ich muss wahrscheinlich etwas ändern, um den neuen API-Änderungen zu entsprechen.

Jeremy

5

Wenn Sie auf Linux sind, Sie könnten einen schnellen Shell-Skript schreiben, den Inhalt der gültigen json Dateien auf Couch zu stellen.

Couch testen ich so etwas wie dies tat:

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

myFile.json hat die json Inhalt ich in die Datenbank importieren wollte.

Eine weitere Alternative, wenn Sie nicht Linux nicht Befehlszeile mögen oder verwenden und eine gui bevorzugen, können Sie ein Tool wie RESTClient

+0

An alle, die nach "POST" suchen: es ist Teil des libwww-perl-Pakets. – ofrommel

3

Ja verwenden, ist dies JSON nicht gültig ...

Um JSON-Objekte ich verwende curl (http://curl.haxx.se) zu importieren:

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

wo my.json eine Datei in das JSON-Objekt ist. Natürlich können Sie Ihre JSON-Objekt direkt in couchdb (ohne Datei) als auch setzen können:

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

Wenn Sie keinen doc_id haben, können Sie couchdb danach fragen:

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

Für alle anderen, die hier im ersten Beispiel eine Fehlermeldung über Content-Type erhalten, versuchen Sie folgendes: 'curl -X POST -d @ data.json http://127.0.0.1:5984/database/_bulk_docs -H 'Inhaltstyp : application/json'' –

+0

Downvoted, weil ich denke, dass die Frage nach mehreren Dokumenten und nicht nur nach einem Dokument fragt. Ich glaube, Sie beantworten, wie Sie nur ein Dokument importieren. –

6

Ausgehend von @Millhouse Antwort, aber mit mehreren docs in meiner Datei verwendete ich

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

POST ist ein Alias ​​von lwp-request aber POST tut scheint nicht auf debian zu funktionieren. Wenn Sie lwp-request verwenden, müssen Sie die Methode wie oben beschrieben mit -m einstellen.

Mit der abschließenden _bulk_docs können mehrere Dokumente gleichzeitig hochgeladen werden.

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

+0

Die Bulk_doc API sollte alle Dokumente in einem '{" docs ": [Dokumente]}' Objekt verschachtelt haben. –

2

Es ist nicht meine Lösung, aber ich fand das mein Problem zu lösen:

Eine einfache Art und Weise eine CouchDB Datenbank in eine Datei zu exportieren, ist durch den folgenden Curl-Befehl in den Terminal-Fenstern ausgeführt wird:

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

der nächste Schritt ist die exportierte jSON-Datei zu ändern, wie so etwas wie die unten zu sehen (man beachte die _id):

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

Haupt-Bit, das Sie betrachten müssen, ist das Hinzufügen der Dokumente im Code-Block "Docs". Sobald dies geschehen ist, können Sie den folgenden Befehl ausführen Locke die Daten in eine CouchDB-Datenbank zu importieren:

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

eine Datenbank Duplizierung Wenn Sie eine Datenbank von einem Server auf einen anderen kopieren möchten. Führen Sie den folgenden Befehl ein:

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/"}' 

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

2

Wahrscheinlich ein bisschen spät zu beantworten. Aber wenn Sie Python verwenden, als Sie die couchdb verwenden Modul so zu tun:

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) 

ich das Python-Skript erstellt, das zu tun (wie ich nicht ein auf Internet finden konnte).

Das vollständige Skript ist hier:

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

(Name -> jsonDb_to_Couch.py)

Wenn Sie zum Download die volle Repo- und:

  1. Text ersetzen alle "_id" in json Dateien "id"

  2. Run load_dbs machen

Es würde 4 Datenbanken in Ihrer lokalen Couch Installation erstellen

Hoffe, dass hilft Neulingen (wie Ich)

+1

Ich glaube, dass Ihr Code folgende Änderungen haben soll: 'couch = couchdb.server ()' fehlende URL 'mit öffnen ()' schließen Sie die Klammer anstelle der Klammer 'db_entry = json.loads (row)' lädt statt laden –

+0

Danke Jared. Es wurde im ursprünglichen Post behoben. – Tanmay

Verwandte Themen