如何在 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) ;
我有一个简单的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) ;