8

我的应用程序有沙发基础视图(map-reduce)。目前,我将它们写在一个文本文件中,并从 couchbase 管理页面为每个新的 couchbase 服务器加载它们(繁琐且容易出错的过程)。

无论如何,在部署新的 couchbase 服务器或创建新的存储桶时,我是否可以将所有这些视图从文本文件加载到 couchbase 中?

我记得在 mysql 中,我们曾经将所有插入查询和过程写入一个文件,并为每个新实例将文件提供给 mysql(通过命令提示符)。couchbase 有没有这样的策略?

4

2 回答 2

6

从您之前与沙发库相关的问题来看,您似乎正在使用 java SDK?SDK 的 1.4 和 2.0 行都允许以编程方式创建设计文档和视图。

使用 Java SDK 1.4.x

您必须以某种方式将视图定义(映射函数、reduce 函数、将它们放在哪个设计文档中)加载为字符串。请参阅http://docs.couchbase.com/couchbase-sdk-java-1.4/#design-documents上的文档。

基本上,您可以通过以下方式在数据库中创建ViewDesign一个:DesignDocumentCouchbaseClient

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);

使用 Java SDK 2.0.x

同样,您必须以某种方式将视图定义(映射函数、reduce 函数、将它们放在哪个设计文档中)加载为字符串。

然后你处理DesignDocument,添加到它,并通过'sDefaultView将设计文档插入到桶中:BucketBucketManager

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);
于 2014-12-06T14:46:52.517 回答
4

Rounds,我们将 coouchbase 用于我们的一些服务器端应用程序,并将 docker 映像用于开发环境。我编写了 2 个脚本来转储现有的 couchbase 并从转储的数据中重新创建 couchbase 存储桶和视图。

视图mapreduce函数被转储为目录层次结构中的纯 javascript 文件,代表 couchbase 中的设计文档和存储桶。将整个目录树提交到您的存储库中非常有帮助,这样您就可以跟踪对视图所做的更改。由于文件是纯 javascript,您可以使用自己喜欢的 IDE 编辑它们并享受自动语法检查。

您可以使用以下 github 存储库中的脚本:

https://github.com/rounds/couchbase-dump

将所有 couchbase 存储桶和视图作为 javascript 文件转储到可以提交到存储库的目录层次结构中。然后,您可以从以前转储的数据中重新创建 couchbase 存储桶和视图。

如果你觉得这对你有帮助并且有什么要补充的,请创建一个问题或在 github 上贡献。

于 2016-04-03T14:11:18.157 回答