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

如何将多个JSON文件上载到CouchDB,json,couchdb,Json,Couchdb,我对CouchDB是新手。我需要在一分钟内从服务器获取60个或更多JSON文件。 一旦收到这些JSON文件,我就必须将它们分别上传到CouchDB。 我在Linux机器上安装了CouchDB。 我希望有人能帮我满足我的要求。 如果可能的话,有人可以帮助我使用伪代码 我的想法是: 是编写一个python脚本,用于将所有JSON文件上载到CouchDB 每个JSON文件都必须是文档中的每个文档和数据 JSON必须插入到CouchDB中 (文件中具有值的指定格式) 注: 这些JSON文件是事务性的,每

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

我的想法是:
  • 是编写一个python脚本,用于将所有JSON文件上载到CouchDB

  • 每个JSON文件都必须是文档中的每个文档和数据 JSON必须插入到CouchDB中 (文件中具有值的指定格式)

  • 注: 这些JSON文件是事务性的,每秒生成1个文件 所以我需要读取上传到CouchDB上相同格式的文件
    成功地将文件上载到不同文件夹的本地系统。

    因此,您需要从服务器获取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)。

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

    这显然有一个怪癖,那就是你需要知道你想从数据库中获取的文档的ID。但对于看跌期权来说,这是完美的。(这并不完全正确,如果您用于文档的ID可以很好地排序,那么您可以使用批量操作获得文档的范围)

    根据我使用CouchDB的经验,我有一种预感,您正在处理事务性文档,以便将它们编译成某种求和结果,并相应地对该数据采取行动(可能会创建系列中的下一个事务性文档)。为此,您可以通过在所创建的视图上使用“reduce”函数来依赖CouchDB。让reduce函数正常工作需要一点练习,这在很大程度上取决于您实际要实现什么以及您准备通过视图发出什么数据,因此我无法提供更多细节

    因此,最终应用程序逻辑将是这样的:

    get _design/someDesign/_view/yourReducedView
    calculate new transaction
    add transaction to queue
    
    onTimeout
       send all in transaction queue
    
    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
    
    如果我理解了为什么你错误地使用事务性文档的第一部分,那么真正改变的是你在我的应用程序逻辑中获取这些事务性文档的部分

    另外,在编写自己的“reduce”函数之前,请先看一下(它们比db引擎之外的任何函数都快得多)

    编辑: 既然你已经开始了,我强烈建议你看看

    以后的注意事项:

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

    python程序解析json并插入CouchDb:
    您可能想签出python3的
    pycouchdb
    模块。我自己也用它将许多JSON对象上传到couchdb实例中。我的项目与您描述的几乎相同,因此您可以查看我的项目以了解详细信息

    我的班级是这样的:

    get _design/someDesign/_view/yourReducedView
    calculate new transaction
    add transaction to queue
    
    onTimeout
       send all in transaction queue
    
    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
    

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

    嗨,谢谢您的回答。我在这里写了一个代码w.r.t您的想法,请帮助我是否正确。我已经发布了我的答案,请回答任何错误。你可能会发现我没有遵循编码标准,请告诉我。为什么不使用新文档而不是“旧”维基?