gpt4 book ai didi

mapreduce - 克服 Couchbase 中的查询限制

转载 作者:行者123 更新时间:2023-12-02 11:27:44 26 4
gpt4 key购买 nike

我们最近从关系型 (MySQL) 转向 NoSQL (couchbase)。基本上它是社交手机游戏的后端。我们在扩展后端以处理越来越多的用户时面临着很多问题。当使用 MySQL 时,由于多个表之间存在大量连接,用户需要花费大量时间进行加载。迁移到 couchbase 后,我们看到了巨大的改进,特别是在加载数据时,因为大部分数据都保存在单个文档中。

缺点是,就查询而言,couchbase 似乎也有很多限制。 Couchbase 的 SQL 查询替代方案是 View 。虽然我们设法使用 Map-Reduce 处理大部分查询,但我们确实很难弄清楚如何处理基于时间的查询。例如我们需要根据时间戳属性过滤用户。如果时间小于当前时间,我们只需要 View 中的用户:

if(user.time < new Date().getTime() / 1000)

发生的情况是,一旦用户的时间设置为 future 的某个时间,它就会从该 View 中豁免,这是所需的行为,但除非我们更新它,否则它永远不会添加回 View - 文档只会在以下位置重新索引更新时查看。

我们现在的解决方案是加载前 x 个用户文档,然后在我们的应用程序中检查时间。排序是根据 user.time 属性完成的,因此我们得到那些时间小于或接近当前时间的用户。但我不确定这是否真的适用于现场环境。理想情况下,我们希望避免在应用程序级别进行此类检查。

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

更新:

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

最佳答案

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

有两种方法:

  1. 不好的方法(不要在生产中这样做)。使用 stale=false 参数查询 View 。这将导致 View 在返回结果之前更新。但 View 索引是一个缓慢的过程,尤其是当您拥有超过 100 万条记录时。

  2. 好方法。使用范围请求。您只需在 map 函数中将日期作为键或复杂键的一部分发出,并使用该范围请求。您可以查看一个示例 herehere (如果您想在 couchbase 中使用 DateTime,则此示例会更有用)。或者看看下面我的例子:

即您将拥有如下文档:

doc = {
"id"=1,
"type"="doctype",
"timestamp"=123456, //document update or creation time
"data"="lalala"
}

对于这些文档, map 函数将如下所示:

map = function(){
if (doc.type === "doctype"){
emit(doc.timestamp,null);
}
}

现在要获取最近“更新”的文档,您需要使用参数查询此 View :

startKey="dateTimeNowFromApp" 
endKey="{}"
descending=true

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

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

关于mapreduce - 克服 Couchbase 中的查询限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18837088/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com