在 python 应用程序的 CouchDB 中创建视图

Create view in CouchDB in a python application

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

这样的视图
function (doc) {
  if(doc.MovieId == "1254")
    emit(doc.Rating, 1);
}

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

我问你是否可以直接从 python create/delete 这样的视图,因为在网上我什么也没找到。 如果不可能,我自己做一个 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.')

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

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

区别在于您需要创建设计文档。

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

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

如您所见,地图函数已保存为字符串。如果要添加格式,则需要使用 \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

我有一个功能:

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 )