是否有任何最佳实践或ReQL特性可以帮助组合复杂的ReQL查询?
为了说明这一点,假设有一个fruits表。每个文档都有以下结构。
{
"id": 123,
"name": "name",
"colour": "colour",
"weight": 5
}如果我们想要检索所有的绿色水果,我们可以使用以下查询。
r
.db('db')
.table('fruits')
.filter({colour: 'green'})然而,在更复杂的情况下,我们可能希望使用各种复杂的命令组合。在这种情况下,可以为每种情况编写定制的查询,但这可能很难维护,并且可能违反不要重复自己(DRY)原则。相反,我们可能希望编写定制的查询,它可以链接自定义命令,从而允许以模块化的方式编写复杂的查询。这可能采用以下形式。
r
.db('db')
.table('fruits')
.custom(component)component可以是一个函数,它接受命令链中的最后一个实体作为其参数,并返回一些内容,如下所示。
function component(chain)
{
return chain
.filter({colour: 'green'});
};这与其说是一个功能建议,不如说是对复杂查询问题的说明,尽管这样的功能看起来确实很有用。
就我个人而言,我自己在解决这个问题上所做的努力包括创建一个compose实用函数。它以一个函数数组作为其主要参数。调用每个函数,将其传递给查询链的一部分,并期望返回查询链的修正版本。迭代完成后,将返回查询组件的composition。这可以在下面查看。
function compose(queries, parameters)
{
if (queries.length > 1)
{
let composition = queries[0](parameters);
for (let index = 1; index < queries.length; index++)
{
let query = queries[index];
composition = query(composition, parameters);
};
return composition;
}
else
{
throw 'Must be two or more queries.';
};
};
function startQuery()
{
return RethinkDB;
};
function filterQuery1(query)
{
return query.filter({name: 'Grape'});
};
function filterQuery2(query)
{
return query.filter({colour: 'Green'});
};
function filterQuery3(query)
{
return query.orderBy(RethinkDB.desc('created'));
};
let composition = compose([startQuery, filterQuery1, filterQuery2, filterQuery3]);
composition.run(connection);如果知道是否存在这样的东西,是否有处理这种情况的最佳实践,或者这是否是ReQL可以从改进中受益的领域,那将是一件很棒的事情。
发布于 2017-06-13 23:58:43
在RethinkDB文档中,它们清楚地指出:所有ReQL查询都是可链接的
查询是通过使用您已经知道的编程语言进行函数调用来构造的。您不必连接字符串或构造专门的JSON对象来查询数据库。所有的ReQL查询都是可链接的。方法将转换器增量链接到查询的末尾。运算符
你不需要编写另一个隐含你的代码的东西,这会使它更难阅读,最终也是不必要的。
简单的方法是分配rethinkdb查询并过滤到变量中,任何时候需要添加更复杂的逻辑时,直接添加到这些变量中,然后在查询完成时运行()
假设我必须搜索具有不同过滤器输入的产品列表并进行分页。下面的代码是在javascript中公开的(这是简单的代码,仅用于说明)
let sorterDirection = 'asc';
let sorterColumnName = 'created_date';
var buildFilter = r.row('app_id').eq(appId).and(r.row('status').eq('public'))
// if there is no condition to start up, you could use r.expr(true)
// append every filter into the buildFilter var if they are positive
if (escapedKeyword != "") {
buildFilter = buildFilter.and(r.row('name').default('').downcase().match(escapedKeyword))
}
// you may have different filter to add, do the same to append them into buildFilter.
// start to make query
let query = r.table('yourTableName').filter(buildFilter);
query.orderBy(r[sorterDirection](sorterColumnName))
.slice(pageIndex * pageSize, (pageIndex * pageSize) + pageSize).run();
https://stackoverflow.com/questions/44488195
复制相似问题