如何将多个JSON文件上传到CouchDB

时间:2014-09-13 16:29:26

标签: json couchdb

我是CouchDB的新手。我需要在一分钟内从服务器获取60个或更多JSON文件。 我收到它们后,我必须单独将这些JSON文件单独上传到CouchDB。 我在我的Linux机器上安装了CouchDB。 我希望有人可以帮助我满足我的要求。 如果可能,有人可以帮我伪代码。

我的想法:

  1. 是编写一个python脚本,用于将所有JSON文件上传到CouchDB。

  2. 每个JSON文件必须是每个文档和数据 必须将JSON插入到CouchDB中 (带有文件中值的指定格式)。

  3. 注意:

    这些JSON文件是Transactional,每生成一个文件 所以我需要将文件上传作为相同的格式读入CouchDB 成功上传将文件存档到不同文件夹的本地系统。

4 个答案:

答案 0 :(得分:1)

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.

答案 1 :(得分:0)

因此,您需要从服务器获取JSON文档,并在收到它们时将它们发送到CouchDB。 Python脚本可以正常工作。这是一些伪代码:

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

在Python中,您可以使用requests将文档发送到CouchDB,也可以从服务器获取文档(如果它使用的是HTTP API)。

答案 2 :(得分:0)

我会使用CouchDB批量API,即使您已指定需要逐个将它们发送到db。例如,通过实施一个简单的队列,通过批量文档调用每隔5到10秒发送一次就会大大提高应用程序的性能。

显然有一个怪癖,那就是你需要知道你想从DB获得的文档的ID。但对于PUT来说它是完美的。 (并非完全正确,如果您使用的文档ID可以很好地排序,则可以使用批量操作获取文档范围。)

根据我使用CouchDB的经验,我有一种预感,你正在处理事务性文档,以便将它们编译成某种总和结果并相应地对这些数据进行操作(可能会创建下一个交易文档系列)。为此,您可以通过在您创建的视图上使用“reduce”函数来依赖CouchDB。需要一些练习才能使reduce函数正常工作,并且高度依赖于实际要实现的内容以及您准备通过视图发出的数据,因此我无法真正为您提供更多详细信息。 / p>

所以最终app逻辑会是这样的:

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

onTimeout
   send all in transaction queue

如果我弄清楚您使用事务性文档的原因的第一部分,那么真正改变的就是您在我的应用逻辑中获取这些事务性文档的部分。

另外,在编写自己的'reduce'函数之前,先看看buil-in ones(它们比db引擎之外的任何东西都快得多)

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

编辑: 自从您开始使用以来,我强烈建议您查看CouchDB Definitive Guide

以后注意:

这是一块隐藏的石头(也许不是一块隐藏的石头,但在任何情况下都不值得为新人注意)。编写reduce函数时,请确保它不会为没有边界的查询生成太多输出。即使在从中获取内容时提供reduce = false,这也会极大地降低整个视图的速度。

答案 3 :(得分:0)

您可能想要查看pycouchdb模块以获取python3。我自己用它来将很多JSON对象上传到couchdb实例中。我的项目与您描述的几乎完全相同,因此您可以查看我的项目Pyro at 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

如果您有任何问题,请告诉我 - 如果您发现我的某些代码可用,我将非常乐意为您提供帮助。