Как загрузить несколько файлов JSON в CouchDB

Я новичок в CouchDB. Мне нужно получить с сервера 60 или более файлов JSON за минуту. Я должен загрузить эти файлы JSON в CouchDB по отдельности, как только я их получу. Я установил CouchDB на свой Linux-компьютер. Я надеюсь, что кто-то может помочь мне с моим требованием. Если возможно, кто-нибудь может мне помочь с псевдокодом.

Моя идея:

  1. Стоит написать скрипт на Python для загрузки всех файлов JSON в CouchDB.

  2. Каждый файл JSON должен быть каждым документом, и данные, представленные в JSON, должны быть вставлены одинаково в CouchDB (указанный формат со значениями в файле).

Примечание:

Эти файлы JSON являются транзакционными, каждую секунду создается 1 файл, поэтому мне нужно прочитать загруженный файл в том же формате в CouchDB при успешной загрузке архива файла в локальную систему другой папки.


person user3782364    schedule 13.09.2014    source источник


Ответы (4)


Я бы использовал массовый API CouchDB, даже если вы указали, что вам нужно отправлять их в базу данных один за другим. Например, реализация простой очереди, которая отправляется каждые, скажем, 5–10 секунд посредством массового вызова документации, значительно повысит производительность вашего приложения.

В этом, очевидно, есть причуда, и вам нужно знать идентификаторы документов, которые вы хотите получить из БД. Но для ПУТов он идеален. (это не совсем так, вы можете получать диапазоны документов, используя массовую операцию, если идентификаторы, которые вы используете для своих документов, можно правильно отсортировать).

Исходя из моего опыта работы с CouchDB, я догадываюсь, что вы имеете дело с транзакционными документами, чтобы скомпилировать их в какой-то итоговый результат и соответственно действовать с этими данными (возможно, создавая следующий транзакционный документ последовательно). В этом вы можете положиться на CouchDB, используя функции сокращения в создаваемых вами представлениях. Требуется небольшая практика, чтобы заставить функцию reduce работать должным образом, и это сильно зависит от того, что вы на самом деле хотите достичь и какие данные вы готовы выдать с помощью представления, поэтому я не могу предоставить вам более подробную информацию об этом.

В итоге логика приложения будет выглядеть примерно так:

get _design/someDesign/_view/yourReducedView
calculate new transaction
add transaction to queue

onTimeout
   send all in transaction queue

Если бы я понял первую часть того, почему вы неправильно используете транзакционные документы, все, что действительно изменилось бы, - это та часть, где вы получаете эти транзакционные документы в логике моего приложения.

Кроме того, прежде чем писать свою собственную функцию уменьшения, ознакомьтесь с встроенными функциями (они намного быстрее, чем что-либо, кроме движка db)

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

РЕДАКТИРОВАТЬ: Поскольку вы начинаете, я настоятельно рекомендую взглянуть на Полное руководство CouchDB.

ПРИМЕЧАНИЕ ПОЗЖЕ:

Вот один скрытый камень (ну, может быть, не столько скрытый камень, но в любом случае не очевидная вещь, на которую стоит обратить внимание новичку). Когда вы пишете функцию сокращения, убедитесь, что она не выдает слишком много вывода для запроса без границ. Это сильно замедлит весь просмотр, даже если вы укажете reduce = false при получении из него материала.

person Dmitry Matveev    schedule 18.09.2014
comment
Почему бы не использовать новую документацию вместо старой вики? docs.couchdb .org / en / latest / api / database / - person Daniel; 18.09.2014

Программа python для синтаксического анализа json и вставки в CouchDb:

import sys
import glob
import errno,time,os
import couchdb,simplejson
import json
from pprint import pprint

couch = couchdb.Server() # Assuming localhost:5984
#couch.resource.credentials = (USERNAME, PASSWORD)
# If your CouchDB server is running elsewhere, set it up like this:
couch = couchdb.Server('http://localhost:5984/')

db = couch['mydb']


path = 'C:/Users/Desktop/CouchDB_Python/Json_files/*.json'
#dirPath = 'C:/Users/VijayKumar/Desktop/CouchDB_Python'   
files = glob.glob(path)
for file1 in files: 
    #dirs = os.listdir( dirPath )
    file2 = glob.glob(file1)

    for name in file2: # 'file' is a builtin type, 'name' is a less-ambiguous variable name.
        try:
            with open(name) as f: # No need to specify 'r': this is the default.
                #sys.stdout.write(f.read())
                json_data=f
                data = json.load(json_data)
                db.save(data)
                pprint(data)
                json_data.close()
                #time.sleep(2)
        except IOError as exc:
                if exc.errno != errno.EISDIR: # Do not fail if a directory is found, just ignore it.
                    raise # Propagate other kinds of IOError.
person user3782364    schedule 18.09.2014

Поэтому вам нужно получать документы JSON с сервера и отправлять их в CouchDB по мере их получения. Сценарий Python подойдет. Вот какой-то псевдокод:

loop (until no more docs)
    get new JSON doc from server
    send JSON doc to CouchDB
end loop

В Python вы можете использовать запросы для отправки документов в CouchDB и, возможно, для получения документов из также сервер (если он использует HTTP API).

person Simon    schedule 16.09.2014
comment
Привет, Спасибо за ответ. Здесь я написал код, связанный с вашей идеей, пожалуйста, помогите мне, правильно он или нет. - person user3782364; 18.09.2014
comment
Я опубликовал свой ответ, пожалуйста, ответьте мне, если есть какие-либо ошибки. Поскольку вы можете обнаружить, что я не следовал стандартам кодирования, пожалуйста, оставайтесь со мной. - person user3782364; 18.09.2014

Возможно, вы захотите проверить модуль pycouchdb для python3. Я сам использовал его для загрузки множества объектов JSON в экземпляр couchdb. Мой проект почти такой же, как вы описали, поэтому вы можете взглянуть на мой проект Pyro на Github , чтобы узнать подробности.

Мой класс выглядит так:

class MyCouch:
""" COMMUNICATES WITH COUCHDB SERVER """

  def __init__(self, server, port, user, password, database):
    # ESTABLISHING CONNECTION
    self.server = pycouchdb.Server("http://" + user + ":" + password + "@" + server + ":" + port + "/")
    self.db = self.server.database(database)

  def check_doc_rev(self, doc_id):
    # CHECKS REVISION OF SUPPLIED DOCUMENT
    try:
        rev = self.db.get(doc_id)
        return rev["_rev"]
    except Exception as inst:
        return -1

  def update(self, all_computers):
    # UPDATES DATABASE WITH JSON STRING
    try:
        result = self.db.save_bulk( all_computers, transaction=False )
        sys.stdout.write( " Updating database" )
        sys.stdout.flush()
        return result
    except Exception as ex:
        sys.stdout.write( "Updating database" )
        sys.stdout.write( "Exception: " )
        print( ex )
        sys.stdout.flush()

        return None

Дайте мне знать, если у вас возникнут какие-либо вопросы - я буду более чем рад помочь, если вы найдете часть моего кода пригодной для использования.

person mnmnc    schedule 18.11.2014