我有一个简单的json:
{
"id": 1,
"name": "John",
"login": "2019-02-13"
}
这类文档存储在Couchbase中,但是现在我想创建索引(或以其他一些合适的方式列出),该索引应过滤login
超过30天的所有文档。我应该如何在Couchbase中创建它并在Scala中获得它?
目前,我从数据库中获取所有文档,并使用API对其进行过滤,但是我认为这不是一个很好的方法。我想在数据库端对其进行过滤,只检索login
超过30天的文档。
现在,在Scala中,我只有通过id获取文档的方法:
bucket.get(id, classOf[RawJsonDocument])
答案 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) ;