如何在Couchbase和Scala中过滤日期

时间:2019-02-14 13:34:53

标签: scala indexing couchbase

我有一个简单的json:

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

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

目前,我从数据库中获取所有文档,并使用API​​对其进行过滤,但是我认为这不是一个很好的方法。我想在数据库端对其进行过滤,只检索login超过30天的文档。

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

bucket.get(id, classOf[RawJsonDocument])

2 个答案:

答案 0 :(得分:2)

我建议您看一下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

答案 1 :(得分: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) ;