是否有任何有助于编写复杂 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 可以从改进中受益的领域。