วิธีอัปโหลดไฟล์ JSON หลายไฟล์ไปยัง CouchDB

ฉันยังใหม่กับ CouchDB ฉันต้องการรับไฟล์ JSON 60 ไฟล์ขึ้นไปภายในหนึ่งนาทีจากเซิร์ฟเวอร์ ฉันต้องอัปโหลดไฟล์ JSON เหล่านี้ไปยัง CouchDB แยกกันทันทีที่ได้รับ ฉันติดตั้ง CouchDB บนเครื่อง Linux ของฉัน ฉันหวังว่าจะมีคนช่วยฉันในเรื่องความต้องการของฉันได้ ถ้าเป็นไปได้มีคนช่วยฉันด้วยรหัสเทียมได้

ความคิดของฉัน:

  1. คือการเขียนสคริปต์ Python เพื่ออัปโหลดไฟล์ JSON ทั้งหมดไปยัง CouchDB

  2. ไฟล์ JSON แต่ละไฟล์ต้องเป็นเอกสารแต่ละฉบับ และข้อมูลที่อยู่ใน JSON จะต้องแทรกเหมือนกันใน CouchDB (รูปแบบที่ระบุพร้อมค่าในไฟล์)

บันทึก:

ไฟล์ JSON เหล่านี้เป็นไฟล์ธุรกรรม โดยจะมีการสร้างไฟล์ทุกๆ 1 วินาที ดังนั้นฉันต้องอ่านไฟล์ที่อัปโหลดในรูปแบบเดียวกันลงใน CouchDB เมื่ออัปโหลดไฟล์เก็บถาวรลงในระบบโลคัลของโฟลเดอร์อื่นได้สำเร็จ


person user3782364    schedule 13.09.2014    source แหล่งที่มา


คำตอบ (4)


ฉันจะใช้ CouchDB Bulk API แม้ว่าคุณจะระบุว่าต้องส่งไปที่ db ทีละรายการก็ตาม ตัวอย่างเช่น การใช้คิวง่ายๆ ที่ส่งออกทุกๆ 5 - 10 วินาทีผ่านการเรียกเอกสารจำนวนมากจะช่วยเพิ่มประสิทธิภาพให้กับแอปพลิเคชันของคุณได้อย่างมาก

เห็นได้ชัดว่ามีนิสัยแปลกๆ ในนั้น และนั่นคือคุณต้องทราบ ID ของเอกสารที่คุณต้องการได้รับจาก DB แต่สำหรับ PUT มันสมบูรณ์แบบ (ไม่เป็นความจริงทั้งหมด คุณสามารถรับเอกสารได้หลากหลายโดยใช้การดำเนินการเป็นกลุ่ม หาก ID ที่คุณใช้สำหรับเอกสารของคุณสามารถจัดเรียงอย่างดี)

จากประสบการณ์ของฉันในการทำงานกับ CouchDB ฉันมีลางสังหรณ์ว่าคุณกำลังจัดการกับเอกสารธุรกรรมเพื่อรวบรวมเป็นผลลัพธ์รวมและดำเนินการกับข้อมูลนั้นตามนั้น (อาจสร้างเอกสารธุรกรรมถัดไปเป็นชุด) เพื่อให้คุณสามารถไว้วางใจ CouchDB ได้โดยใช้ฟังก์ชัน 'ลด' ในมุมมองที่คุณสร้าง ต้องใช้การฝึกฝนเล็กน้อยเพื่อให้ฟังก์ชันลดทำงานได้อย่างถูกต้องและขึ้นอยู่กับสิ่งที่คุณต้องทำจริง ๆ ว่าจะบรรลุผลสำเร็จและข้อมูลใดที่คุณเตรียมที่จะปล่อยออกมาจากมุมมอง ดังนั้นฉันจึงไม่สามารถให้รายละเอียดเพิ่มเติมแก่คุณได้จริงๆ

ดังนั้นท้ายที่สุดแล้ว ตรรกะของแอปจะเป็นดังนี้:

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

onTimeout
   send all in transaction queue

ถ้าฉันเข้าใจส่วนแรกว่าทำไมคุณถึงใช้เอกสารธุรกรรมผิด สิ่งที่จะเปลี่ยนไปจริงๆ ก็คือส่วนที่คุณได้รับเอกสารธุรกรรมเหล่านั้นในตรรกะของแอปของฉัน

นอกจากนี้ ก่อนที่จะเขียนฟังก์ชัน 'reduce' ของคุณเอง โปรดดูที่ ฟังก์ชันในตัว (มันเร็วกว่ามากเมื่อเทียบกับอะไรก็ตามที่อยู่นอกเอ็นจิ้น db ก็สามารถทำได้)

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

แก้ไข: เนื่องจากคุณเพิ่งเริ่มต้น ฉันขอแนะนำอย่างยิ่งให้ดูที่CouchDB Definitive Guide

หมายเหตุสำหรับภายหลัง:

นี่คือหินที่ซ่อนอยู่ก้อนหนึ่ง (อาจจะไม่ใช่หินที่ซ่อนอยู่มากนัก แต่ก็ไม่ใช่สิ่งที่ชัดเจนที่ต้องระวังสำหรับผู้มาใหม่ไม่ว่าในกรณีใดก็ตาม) เมื่อคุณเขียนฟังก์ชันลด ตรวจสอบให้แน่ใจว่าไม่ได้สร้างผลลัพธ์มากเกินไปสำหรับการสืบค้นที่ไม่มีขอบเขต สิ่งนี้จะทำให้การดูทั้งหมดช้าลงอย่างมากแม้ว่าคุณจะระบุลด=เท็จเมื่อรับสิ่งต่าง ๆ

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