我正在学习Couchbase,现在是3.x版
我的疑问是,我何时应该使用N1QL查询与View查询?
而且,它们之间是否存在性能差异?
注意:我有一个情况:
一个桶有两个文档类型为我的旅行应用程序:路线和城市
一个路由文档保存有关行驶路线的阵列信息城 IDS是它的一部分,然后另一文档保存城市的信息(每个城市有自己的文档).例:
//Bucket : "Traveling App"
{
"type" : "route"
"name" : "The Great Adventure",
"cities" : ["234", "h4345", "h42da"]
}
{
"type" : "city",
"name" : "Little Town",
"UID" : "234"
}
Run Code Online (Sandbox Code Playgroud)
当我查询某个旅行路线时,我应该进行N1QL查询还是查看查询?
因为我必须首先打开Route doc,获取cities数组而不是获取每个City doc.
我认为这种架构最好,因为有些路线可能只有很少的城市而其他路线可能有很多城市.
假设存储桶中有大量数据(> 100GB,> 100M文档,> 12种文档类型),并假设每个视图仅适用于一种文档类型,那么每个桶的视图数量是多少?或者问另一种方式,在什么时候应该将某些文档类型拆分成单独的存储区以节省处理所有文档类型的所有视图的开销?
我很难决定如何将数据拆分成couchbase存储桶,以及数据所需视图的性能影响.我的数据由十几个关系数据库组成,其中至少有一半在许多表中有数亿行.
该http://www.couchbase.com/docs/couchbase-manual-2.0/couchbase-views-writing-bestpractice.html文档节"使用的文件类型"似乎暗示在同一个桶有多种文档类型并不理想,因为针对所有文档更新特定文档类型的视图,甚至是那些永远不会与视图匹配的文档.实际上,它建议将数据分成桶以避免这种开销.
然而,出于性能原因,每个群集限制为10个桶.因此,我唯一的结论是每个集群可以有效地处理最多10个大型文档集合.这准确吗?
我的应用程序有couchbase视图(map-reduce).目前,我正在将它们写在一个文本文件中,并从couchbase管理页面为每个新的couchbase服务器加载它们(繁琐且容易出错的过程).
无论如何,当我部署一个新的couchbase服务器或者当我创建一个新的存储桶时,我可以将所有这些视图从文本文件加载到couchbase中吗?
我记得在mysql中,我们曾经将所有插入查询和过程写入文件,并将文件提供给mysql(通过命令提示符)为每个新实例.是否有任何此类策略可用于couchbase?
试图做一个DISTINCT减少,我从了,当我得到一个错误在这里.我在啤酒样品桶上重现了这个错误,所以这应该很容易重现.我没有看到mapreduce_errors.txt文件中的任何错误,或任何会导致我在其他任何地方的任何错误.(如果您希望我搜索或发布其他文件的片段,请询问).
在Windows 2008 R2上运行couchbase enterprise 4 beta(这也发生在3.0.1社区版本上).
这是我的地图功能(使用啤酒样品桶,直接与couchbase一起发货).
function(doc, meta) {
switch(doc.type) {
case "brewery":
emit(meta.id);
break;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的reduce函数:
function(keys, values, rereduce) {
return keys.filter(function (e, i, arr) {
return arr.lastIndexOf(e) === i;
});
}
Run Code Online (Sandbox Code Playgroud)
这是错误:
原因:错误(减速机:)
如果它有帮助,也是视图页面的一部分:http://i.imgur.com/KyLutMc.png
我只是按照这篇文章来测试Couchbase View.当编辑视图使用Couchbase GUI并保存时,视图没有立即更新.
例如.使用php脚本将一些数组存储到Couchbase.并在'dev_sessions'文档中定义一个命名的'last'视图:
function (doc) {
if(doc.namespace == 'sessions') {
emit(doc.lastSeen, 1);
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用curl获取json结果.第一次:
$ curl
http://192.168.228.134:8092/default/_design/dev_sessions/_view/last/?group_level=1&reduce=true'
{"rows":[ ] }
Run Code Online (Sandbox Code Playgroud)
第二:
$ curl 'http://192.168.228.134:8092/default/_design/dev_sessions/_view/last/?group_level=1&reduce=true'
{"rows":[
{"key":1352872218,"value":1},
{"key":1352879418,"value":3}
]
}
Run Code Online (Sandbox Code Playgroud)
另一个测试,在php脚本中添加一个新数组:
'eb255262434407766f212d1b6f23' => array(
'namespace' => 'sessions',
"type" => "user",
"userID" => "1107",
'lastSeen' => time(),
'firstSeen' => time(),
"remoteAddress" => "2.3.4.5",
"location" => "Vienna/Austria",
"name" => "Golden K"
Run Code Online (Sandbox Code Playgroud)
再次运行curl,第一次:
$ curl 'http://192.168.228.134:8092/default/_design/dev_sessions/_view/last/?group_level=1&reduce=true'
{"rows":[
{"key":1352872218,"value":1},
{"key":1352879418,"value":3}
]
}
Run Code Online (Sandbox Code Playgroud)
第二次:
$ curl 'http://192.168.228.134:8092/default/_design/dev_sessions/_view/last/?group_level=1&reduce=true'
{"rows":[
{"key":1352875163,"value":1},
{"key":1352882363,"value":4}
]
} …Run Code Online (Sandbox Code Playgroud) 我一直在试图找出如何根据时间戳恢复数据.基本上我想基于时间戳字段查询100个文档.100个文档应该比我传递它的时间戳更旧.此外,我想创建一个刷新,我可以传递一个时间戳,我得到100个更新的文档.显然逻辑在这里会有所不同,但很难弄清楚Couchbase如何实现这一目标.
这是我到目前为止:
我的观点,正如你所看到的,我还需要使用复杂的密钥,因为我不仅要检查日期,还要检查我的可见性字段.我在视图的reduce部分没有任何内容.
function (doc, meta)
{
if(meta.type == "json" && doc.type == "POST" && doc.created != null)
{
emit([dateToArray(doc.created), doc.visibility], null);
}
}
Run Code Online (Sandbox Code Playgroud)
我正在查询使用java客户端,将limit设置为2进行测试.这里有什么奇怪的是setDescending必须是false才能得到任何回报.我传递的日期也无关紧要我总能得到一个结果.我想要的预期行为是传递日期,只获得等于或早于日期的结果.
View view = client.getView("dev_posts", "post_list");
ComplexKey keys = ComplexKey.of(DataConstants.getDateAsArray(startDate), postType);
Query query = new Query();
query.setRangeStart(keys);
query.setIncludeDocs(true);
query.setLimit(2);
query.setDescending(false);
ViewResponse response = client.query(view, query);
Run Code Online (Sandbox Code Playgroud)
编辑:
基本上我从Couchbase寻找的东西类似于Facebook,Pintrest等移动应用程序.在用户刷新的给定时间戳上,我想获得更新的东西.当用户滚动时,我想让下一个组超过特定日期.
**更新**
所以这已经解决了,但是要进一步研究它.ComplexKey正在将我们的日期数组转换为"[2013,11,8,20,0,0]"而不是[2013,11,8,20,0,0].要进一步调查它.现在解决的办法是不使用ComplexKey,而是创建我们自己的复杂密钥,并将其作为密钥传递给startKey.
我有一个带有映射器的简单视图,它会发出带有一些键的文档。
com.couchbase.lite.View view = database.getView(VIEW_NAME);
if (view.getMap() == null) {
Mapper map = new Mapper() {
@Override
public void map(Map<String, Object> document, Emitter emitter) {
if ("user".equals(document.get("type"))) {
emitter.emit(document.get("name"), document);
}
}
};
view.setMap(map, null);
}
Run Code Online (Sandbox Code Playgroud)
有了这个视图,我就可以在上面创建查询,并使用某些参数,如 setKeys、startKey、endKey、setDescending、setDescending、setSkip 等,如 couchbase手册中所述。
如果我写
Query query = view.createQuery();
List<Object> keys = new ArrayList<>();
keys.add("User Name");
query.setKeys(keys);
Run Code Online (Sandbox Code Playgroud)
该查询将返回与“用户名”键匹配的所有文档。
但我找不到一种简单的方法来编写排除(省略)具有某些键的文档的查询(与 setKeys() 函数相反)
在ToDoLite 示例中发现了一个 hack 代码如下所示:
public static Query getQuery(Database database, final String ignoreUserId) {
com.couchbase.lite.View view = database.getView(VIEW_NAME);
if (view.getMap() == …Run Code Online (Sandbox Code Playgroud) 我想写一个地理空间视图,该视图从给定的纬度和经度搜索半径一英里范围内的以下文档.我该怎么做呢?
{
"agree_allowed":true,
"assigned_by":"",
"assigned_to":"",
"comments_allowed":true,
"location": {
"coordinates": [
"-74.168868",
"40.854655"
],
"type": "Point"
},
"subscribed":{
"user_cfd29b81f0263a380507":true,
"user_cfd29b81f0263a3805010":true
},
"type":"report",
"user_id":"user_cfd29b81f0263a380507",
"username":"test17"
}
Run Code Online (Sandbox Code Playgroud) 我在舞台环境中使用Couchbase Server.事情一直很好,直到昨天.但是从今天开始,当负载适度增加时,我观察到高CPU使用率.(PFA)
Couchbase集群配置: -
3节点集群运行(4.5.1-2844 Community Edition(build-2844))每台都有m4.2xlarge(8核,32 GB RAM) AWS机器.
数据RAM配额:25000 MB索引RAM配额:2048MB
它有9个水桶.用过的存储桶有9 GB RAM(即每个集群3 GB)
注意: - 由于我们使用的是社区版,因此每个节点都运行数据,全文,索引和查询服务.
如果我做了一些错误配置或者需要进行任何优化,请告诉我.
我有以下格式存储的couchbase文档:
{
"userEmail": "satyam@xyz.com",
"hashedPassword": "$2a$12$MT31FHNEbOAKpQGzLdBB3uhLlPlGNU0cvsgi/2pt4TdwPjvrUzkSG",
"type": "user",
}
Run Code Online (Sandbox Code Playgroud)
我想只读取userEmail值为satyam@xyz.com的文档.为此我写了一个基础视图:
function (doc, meta) {
if(doc.userEmail == "satyam@xyz.com")
emit(doc.data, meta.id);
}
Run Code Online (Sandbox Code Playgroud)
现在我想要的是,我想从Java代码中传递值"satyam@xyz.com".我尝试了很多,但找不到合适的解决方案.任何人都可以帮助我摆脱这种困境.
提前感谢任何建议.