首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应该如何组合复杂的ReQL查询?

应该如何组合复杂的ReQL查询?
EN

Stack Overflow用户
提问于 2017-06-12 03:59:09
回答 1查看 161关注 0票数 0

是否有任何最佳实践或ReQL特性可以帮助组合复杂的ReQL查询?

为了说明这一点,假设有一个fruits表。每个文档都有以下结构。

代码语言:javascript
复制
{
    "id": 123,
    "name": "name",
    "colour": "colour",
    "weight": 5
}

如果我们想要检索所有的绿色水果,我们可以使用以下查询。

代码语言:javascript
复制
r
    .db('db')
    .table('fruits')
    .filter({colour: 'green'})

然而,在更复杂的情况下,我们可能希望使用各种复杂的命令组合。在这种情况下,可以为每种情况编写定制的查询,但这可能很难维护,并且可能违反不要重复自己(DRY)原则。相反,我们可能希望编写定制的查询,它可以链接自定义命令,从而允许以模块化的方式编写复杂的查询。这可能采用以下形式。

代码语言:javascript
复制
r
    .db('db')
    .table('fruits')
    .custom(component)

component可以是一个函数,它接受命令链中的最后一个实体作为其参数,并返回一些内容,如下所示。

代码语言:javascript
复制
function component(chain)
{
    return chain
        .filter({colour: 'green'});
};

这与其说是一个功能建议,不如说是对复杂查询问题的说明,尽管这样的功能看起来确实很有用。

就我个人而言,我自己在解决这个问题上所做的努力包括创建一个compose实用函数。它以一个函数数组作为其主要参数。调用每个函数,将其传递给查询链的一部分,并期望返回查询链的修正版本。迭代完成后,将返回查询组件的composition。这可以在下面查看。

代码语言:javascript
复制
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可以从改进中受益的领域,那将是一件很棒的事情。

EN

回答 1

Stack Overflow用户

发布于 2017-06-13 23:58:43

在RethinkDB文档中,它们清楚地指出:所有ReQL查询都是可链接的

查询是通过使用您已经知道的编程语言进行函数调用来构造的。您不必连接字符串或构造专门的JSON对象来查询数据库。所有的ReQL查询都是可链接的。方法将转换器增量链接到查询的末尾。运算符

你不需要编写另一个隐含你的代码的东西,这会使它更难阅读,最终也是不必要的。

简单的方法是分配rethinkdb查询并过滤到变量中,任何时候需要添加更复杂的逻辑时,直接添加到这些变量中,然后在查询完成时运行()

假设我必须搜索具有不同过滤器输入的产品列表并进行分页。下面的代码是在javascript中公开的(这是简单的代码,仅用于说明)

代码语言: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();

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44488195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档