在 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);
}
是最理想的。问题是我必须为更多 MovieId
s(从键盘输入获取)执行此视图。
我问你是否可以直接从 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 )
我在 CouchDB 中有一个数据库,我想知道是否可以直接从 python 而不是使用 GUI 创建视图。 我是 CouchDB 的初学者,我需要一个相当于 SELECT DISTINCT in SQL 的函数和一个像
这样的视图function (doc) {
if(doc.MovieId == "1254")
emit(doc.Rating, 1);
}
是最理想的。问题是我必须为更多 MovieId
s(从键盘输入获取)执行此视图。
我问你是否可以直接从 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 )