我有一个简单的json:
{
"id": 1,
"name": "John",
"login": "2019-02-13"
}
这种文件存储在Couchbase中,但是现在我想创建索引(或其他一些时间列表),它应该过滤所有login
早于30天的文档。我应该如何在Couchbase中创建它并在Scala中获取它?
现在我从数据库中获取所有文档并在API中过滤它们,但我认为这不是很好的方法。我想在数据库端过滤它,并只检索那些有30天以上的login
的文档。
现在,在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。由于你是N1QL的新手,我建议你查看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) ;