如何在 Couchbase 和 Scala 中过滤日期

How to filter dates in Couchbase and Scala

我有一个简单的json:

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

这种文件存储在 Couchbase 中,但现在我想创建索引(或以其他方式列出),它应该过滤所有 login 早于 30 天的文件.我应该如何在 Couchbase 中创建它并在 Scala 中获取它?

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

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

bucket.get(id, classOf[RawJsonDocument])

我建议看一下 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 in the documentation. And since you are new to N1QL, I'd recommend checking out the interactive N1QL tutorial

以下查询效率更高,因为当索引键与谓词关系运算符的一侧匹配时,它可以将谓词推送到 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) ;