首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >克服Couchbase中的查询限制

克服Couchbase中的查询限制
EN

Stack Overflow用户
提问于 2013-09-16 20:50:55
回答 1查看 2.9K关注 0票数 2

我们最近从关系(MySQL)转向了NoSQL (couchbase)。基本上它是社交移动游戏的后端。我们在扩展后端以处理越来越多的用户时遇到了很多问题。在使用MySQL加载时,用户花费了大量时间,因为多个表之间存在大量连接。在移到couchbase之后,我们看到了一个巨大的改进,特别是在加载数据时,因为大多数数据都保存在一个文档中。

在缺点方面,couchbase在查询方面似乎也有很多限制。Couchbase替代SQL查询的方法是视图。虽然我们成功地使用map- most处理了大多数查询,但我们确实很难弄清楚如何处理基于时间的查询。我们需要根据时间戳属性过滤用户。如果时间少于当前时间,我们只需要一个用户:

代码语言:javascript
复制
if(user.time < new Date().getTime() / 1000)

一旦用户的时间被设置为将来的某个时间,它就会被豁免在这个视图之外--这个视图是想要的行为,但是它永远不会被添加回视图,除非我们更新它--一个文档只有在更新时才会被重新索引。

我们现在的解决方案是先加载x用户文档,然后检查应用程序中的时间。排序是在user.time属性上进行的,因此我们可以得到那些时间少于或接近当前时间的用户。但我不确定这是否真的能在生活环境中起作用。理想情况下,我们希望在应用程序级别避免这种类型的检查。

此外,有时我们需要检查多个基于时间的属性,例如进行匹配。我们当前的策略在这种情况下不起作用,我们经常从视图中获得文档,这些文档在应用程序中无法通过这些检查。如果已经解决过类似问题的人能分享他们的经验,我将非常感激。提前谢谢。

更新:

我们尝试使用只适用于一个键的范围查询。就像我说的,在大多数情况下,我们有多个基于时间的键,这意味着多个范围不起作用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-16 21:29:41

如果在视图函数中使用Date().getTime(),您将始终得到该视图被索引的时间,就像您所说的“除非我们更新它,否则它永远不会被添加回视图”。

有两种方式:

  1. 不好的方法(在生产中不要这样做)。使用stale=false param查询视图。这将导致视图在返回结果之前进行更新。但是,查看索引是一个缓慢的过程,特别是当你有超过1000条记录的时候。
  2. 好办法。使用范围请求。您只需要在map函数中将日期作为一个键或复杂键的一部分发出,并使用该范围请求。您可以看到一个示例这里这里 (如果您想在couchbase中使用DateTime,这个示例将更有用)。或者看看下面的例子:

也就是说,您将拥有如下的文档:

代码语言:javascript
复制
doc = {
 "id"=1,
 "type"="doctype",
 "timestamp"=123456, //document update or creation time
 "data"="lalala"
}

对于那些docs,map函数如下所示:

代码语言:javascript
复制
map = function(){
 if (doc.type === "doctype"){
  emit(doc.timestamp,null);
 }
}

现在,要获得最近“更新”的文档,您需要使用params查询此视图:

代码语言:javascript
复制
startKey="dateTimeNowFromApp" 
endKey="{}"
descending=true

注意,startKey和endKey是交换的,因为我使用了降序。这里还有一个关于couchbase支持的关键类型的文献网链接。

此外,我还找到了一个指向问题的链接,它也可以提供帮助。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18837088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档