如何在Couchbase和Scala中过滤日期

问题描述 投票:1回答:2

我有一个简单的json:

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

这种文件存储在Couchbase中,但是现在我想创建索引(或其他一些时间列表),它应该过滤所有login早于30天的文档。我应该如何在Couchbase中创建它并在Scala中获取它?

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

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

bucket.get(id, classOf[RawJsonDocument])
scala indexing couchbase
2个回答
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


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) ;
© www.soinside.com 2019 - 2024. All rights reserved.