我的应用程序有基础视图(map-reduce)。目前,我正在将它们写在一个文本文件中,并从couchbase管理页面为每个新的couchbase服务器加载它们(繁琐且容易出错的过程)。
在部署新的couchbase服务器或创建新的存储桶时,我是否可以将所有这些视图从文本文件加载到couchbase中?
我记得在mysql中,我们曾经将所有插入查询和过程写入文件,并将文件提供给mysql(通过命令提示符)为每个新实例。是否有任何此类策略可用于couchbase?
答案 0 :(得分:4)
从您以前的沙发基础相关问题来看,您似乎正在使用java SDK? SDK的1.4和2.0行都允许以编程方式创建设计文档和视图。
你必须以某种方式加载你的视图定义(映射函数,简化函数,在哪些设计文档中放置它们),如字符串。请参阅http://docs.couchbase.com/couchbase-sdk-java-1.4/#design-documents上的文档。
基本上,您在ViewDesign
中通过DesignDocument
在数据库中创建CouchbaseClient
:
DesignDocument designDoc = new DesignDocument("beers");
designDoc.setView(new ViewDesign("by_name", "function (doc, meta) {" +
" if (doc.type == \"beer\" && doc.name) {" +
" emit(doc.name, null);" +
" }" +
"}"));
client.createDesignDoc(designDoc);
以同样的方式,您必须以某种方式加载视图定义(地图函数,减少函数,在哪个设计文档中放置它们),如字符串。
然后您处理DesignDocument
,向其添加DefaultView
,然后通过Bucket
BucketManager
{/ 1>}将设计文档插入到广告位中
List<View> viewsForCurrentDesignDocument = new ArrayList<View>(viewCountForCurrentDesignDoc);
//... for each view definition you loaded
View v = DefaultView.create(viewName, viewMapFunction, viewReduceFunction);
viewsForCurrentDesignDocument.add(v);
//... then create the designDocument proper
DesignDocument designDocument = DesignDocument.create(designDocName, viewsForCurrentDesignDocument);
//optionally you can insert it as a development design doc, retrieve an existing one and update, etc...
targetBucket.bucketManager().insertDesignDocument(designDocument);
答案 1 :(得分:3)
在Rounds,我们对部分服务器端应用程序使用couchbase,并将docker镜像用于开发环境。 我编写了2个脚本来转储现有的couchbase,并从转储的数据中重新创建couchbase存储桶和视图。
视图std::seed_seq
和map
函数作为普通javascript文件转储到目录层次结构中,该层次结构表示couchbase中的设计文档和存储桶。将整个目录树提交到您的仓库非常有用,这样您就可以跟踪对视图所做的更改。
由于文件是普通的javascript,您可以使用您喜欢的IDE编辑它们并享受自动语法检查。
您可以使用以下github repo中的脚本:
https://github.com/rounds/couchbase-dump
将所有的couchbase存储桶和视图转储为您可以提交到repo的目录层次结构中的javascript文件。然后,您可以从以前转储的数据中重新创建couchbase存储桶和视图。
如果您觉得这很有帮助,可以添加一些内容,请在github上创建一个问题或做出贡献。