【问题标题】:Create view in CouchDB in a python application在 Python 应用程序中的 CouchDB 中创建视图
【发布时间】:2020-04-30 16:51:34
【问题描述】:

我在 CouchDB 中有一个数据库,我想知道是否可以直接从 python 创建视图而不是使用 GUI。 我是 CouchDB 的初学者,我需要一个与 SQL 中的 SELECT DISTINCT 等效的函数和类似的视图

function (doc) {
  if(doc.MovieId == "1254")
    emit(doc.Rating, 1);
}

是理想的。问题是我必须为更多MovieIds(取自键盘输入)执行此视图。

我问你是否可以直接从 python 创建/删除这样的视图,因为在网上我什么也没找到。 如果不可能,我自己进行 Mango 查询和映射结果是个好主意吗?

---编辑---

json_data = {
  "_id": "_design/titaRat",
  "_rev": "3-ceb11154b13457c55b1f98f4e9d15b03",
  "views": {
    "titRat": {
      "map": "function (doc) { var id_prefix = \"ratings :\"; if(doc._id.substr(0, id_prefix.length) === id_prefix && doc.MovieId == \"1721\") emit(doc.Rating, 1);}",
      "reduce": "_count"
    }
  },
  "language": "javascript",
  "options": {
    "partitioned": False
  }
}

db.save(json_data)


ResourceConflict: ('conflict', 'Document update conflict.')

我收到此错误,但没有具有此名称的文档

【问题讨论】:

  • id为"_design/titaRat"的文档是否已经存在?如果您没有为现有文档提供正确的_rev,或者在新文档中包含_rev,则会发生文档更新冲突。如果这是一个新文档,请删除_rev
  • 该文档不存在,但我想通过从GUI复制JSON文档来作弊,我忘记删除“_rev”字段......我感觉很愚蠢哈哈哈它现在可以了,谢谢

标签: python nosql couchdb cloudant couchdb-mango


【解决方案1】:

我有一个功能:

def createView( dbConn, designDoc, viewName, mapFunction ):
    data = {
            "_id": f"_design/{designDoc}",
            "views": {
                viewName: {
                    "map": mapFunction
                    }
            },
            "language": "javascript",
            "options": {"partitioned": False }
            }
    logging.info( f"creating view {designDoc}/{viewName}" )
    dbConn.save( data )

调用示例如下:

mapFunction = '''function (doc) {
                      if( doc.type == 'word')
                      emit(doc.word, doc);
                    }'''
createView( db, "DESIGN_DOC_NAME", "VIEW_NAME", mapFunction )

【讨论】:

    【解决方案2】:

    您可以从 python 创建视图,就像在沙发 deb 中创建任何文档一样。

    不同之处在于您需要创建一个设计文档。

    您的函数的文档如下所示:

    {
      "views": {
        "movie_ratings_view": {
          "map": "function(doc) { if(doc.MovieId == "1254") emit(doc.Rating, 1); }",
        }
      }
    }
    

    如您所见,map 函数保存为字符串。如果要添加格式,则需要使用 \n\t 进行添加。

    要保存此文档,您可以 POST 将其保存到 POST /{db}/_design/movie_ratings_ddoc

    然后您可以通过GET /{db}/_design/movie_rations_ddoc/_view/movie_ratings_view 调用您的视图

    您可以为每个设计文档保存多个视图。

    如果您想删除一个视图,您可以删除整个设计文档,或者只更新设计文档,将视图从对象中删除。

    有关如何使用视图的更多信息,请阅读:https://docs.couchdb.org/en/master/api/ddoc/views.html

    【讨论】:

    • 我已经尝试过了,我也尝试过保存从 GUI 创建的 ddoc,但是当我执行 db.save(document) 时,我有“文档 _id 必须是分区: _id”错误。我不知道该怎么做
    • @Malotino 如果您希望 vie 是全球性的,您需要将 "options": { "partitioned": false } 放入文档中,或者以 "{partition_id} 格式形成 _id: {document_id}" 如果视图用于本地分区。让我知道它是否有效。
    • 我无法在 python 中做到这一点,它在 JSON 文档中给了我很多错误。我已经在几分钟内完成了一个查询,该查询与从键盘获取的 MovieId 一起使用,然后我已经映射了我的结果......也许这不是最好的解决方案,但它可以工作
    • @Malotino 你能更新你的问题吗?请发布您尝试过的内容并发布错误消息。然后我可以调查一下。
    猜你喜欢
    • 2018-11-04
    • 2018-07-16
    • 2014-10-17
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多