【问题标题】:How to filter dates in Couchbase and Scala如何在 Couchbase 和 Scala 中过滤日期
【发布时间】:2019-02-14 13:34:52
【问题描述】:

我有一个简单的 json:

{
 "id": 1,
 "name": "John",
 "login": "2019-02-13"
}

此类文档存储在 Couchbase 中,但现在我想创建索引(或以其他一些适时的方式列出),它应该过滤 login 超过 30 天的所有文档。我应该如何在 Couchbase 中创建它并在 Scala 中获取它?

现在我从数据库中获取所有文档并在 API 中过滤它们,但我认为这不是很好的方法。我想在数据库端过滤它,只检索 login 超过 30 天的文档。

现在,在 Scala 中,我只有通过 id 获取文档的方法:

bucket.get(id, classOf[RawJsonDocument])

【问题讨论】:

  • 哪个版本的 Couchbase?你试过 N1QL 吗?
  • 版本 5+。不,我没有尝试。效率高吗?
  • 这很可能比从数据库中读取每个文档并自己过滤更有效。

标签: scala indexing couchbase


【解决方案1】:

我建议看一下 N1QL(它只是用于 JSON 的 SQL)。这是一个例子:

SELECT u.*
FROM mybucket u
WHERE DATE_DIFF_STR(NOW_STR(), login, 'day') > 30;

您还需要一个索引,例如:

CREATE INDEX ix_login_date ON mybucket (login);

虽然我不能保证这是最好的索引,但它至少能让你入门。

我使用了 DATE_DIFF_STR 和 NOW_STR,但还有其他方法可以处理日期。查看文档中的Date Functions。由于您是 N1QL 的新手,我建议您查看 interactive N1QL tutorial

【讨论】:

  • 谢谢。我会尝试使用它,看起来比在 API 中过滤更有效。
【解决方案2】:

下面的查询效率更高,因为它可以在索引键与谓词关系运算符的一侧匹配时将谓词推送到IndexScan。如果您有从索引键派生的表达式,它将获取所有值并在查询引擎中进行过滤。

CREATE INDEX ix_login_date ON mybucket (login);
SELECT u.*
FROM mybucket AS u
WHERE u.login < DATE_ADD_STR(NOW_STR(), 'day', -30) ;

【讨论】:

  • 所以我需要在数据库上创建索引,并在代码中使用 N1QL 来检索它?
猜你喜欢
  • 2015-01-20
  • 1970-01-01
  • 2022-08-11
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
  • 2019-11-21
  • 2015-11-26
  • 2023-02-02
相关资源
最近更新 更多