2017-08-11 9 views
2

ユーザの入力に応じて結果をソートしたいと思います。ArangoDB - カスタム関数でaqlの結果をソート

は、私は次のようになりますsortオブジェクトを考えてみましょう:

var sort = {createdAt: 1, name: 1} 

そして、私はこのようになりますクエリがあります:

FOR f in [{createdAt: 123, name: 'BBB'},{createdAt: 2000, name: 'ZZZ'}, {createdAt: 2000, name: 'BBB'}] 
    SORT f.createdAt DESC 
    RETURN f 

var sort = {createdAt: -1} 

または、このような

それは大丈夫です。 しかし、ソートオブジェクトでユーザーによって渡されるフィールドの結果をソートしたいと思います。 私は、カスタムアランゴ機能を追加しました:

db.createFunction(
    'CUSTOM::FILTERING::SORT_STRING', 
      String(function (sort, it) { 
        return sort && Object.keys(sort).length !== 0 && sort.constructor === Object ? Object.keys(sort).map(key => `${it}.${key} ${sort[key] >= 0 ? 'ASC' : 'DESC'}`).join(', ') : ''; 
      }) 
     ); 

が、私はそれにそれがすべてでは動作しません。その方法を使用しています。結果は決してソートされません。

FOR f in [{createdAt: 123, name: 'BBB'},{createdAt: 2000, name: 'ZZZ'}, {createdAt: 2000, name: 'BBB'}] 
    SORT CUSTOM::FILTERING::SORT_STRING(${sort}, 'f') 
    RETURN f 

異なる入力引数に基づいて結果をソートするにはどうすればよいですか?

+0

ArangoDB内でFoxx Microservicesを見たことがありますか?これは完全なアプリケーションであり、FoxxにREST APIを提示させてから、ユーザーがSort、PageNum、PageSize、Query属性を提供できるようになり、Foxx REST APIがそれを行います。 –

+0

@DavidThomasあなたはそれを実装するいくつかの例を教えてくれますか? – MatiK

+0

[この回答](https://stackoverflow.com/questions/42427063/sending-http-post-request-from-node-to-foxx-service-arangodb/42451340#42451340)をご覧ください。 REST APIリクエストに応答するようにFoxxマイクロサービスを設定する方法の例。呼び出し元がパス、クエリ文字列、または本文のいずれかを使用して追加のクエリパラメータを指定し、コードで適切なクエリを呼び出すようにすることができます。 Foxx Microserviceを書く方法はこの質問の範囲を超えていますが、Node.js形式の形式に従います。オンラインでは多くの例があります。特にgithub.comにあります。 –

答えて

1

ピュアAQL、あなたがこれを行うことができますが、世界のどこかで子犬が死んでしまう...

RETURN (@sortBy == 'createdAt' ? 
    (FOR d IN @@collectionName 
    SORT createdAt DESC 
    RETURN d) : (@sortBy == 'name' ? 
     (FOR d in @@collectionname 
     SORT name DESC 
     RETURN d) 
    ) 
) 
) 

しかし、他の方法は、あなたが安全にそれを行うことができますチェックし、適切なコードで、動的AQLを生成することです。

AQLを動的に生成することがありますが、すべてのパラメータを慎重にスキャンし、清掃し、Joiスキーマでプルーフし、SQLインジェクションを停止するように検証します。

このスタイルのクエリを行うための他の方法は次のとおりです。

LET sortByCreatedAt = (
    FOR d in @@collectionName 
    SORT createdAt DESC 
    RETURN d) 

LET sortByName = (
    FOR d in @@collectionName 
    SORT name DESC 
    RETURN d) 

RETURN (@sortBy == 'createdAt') ? sortByCreatedAt : sortByName 

これはかなりありませんが、動作し、創造性をあなたにも、オプションとしてASCとDESCで重く、ネストされた、複雑なクエリを書くことができますあらかじめ定義された数の列名として使用します。重要なのは、列名を完全に動的にすることはできませんが、ユーザーを選択できることです。

これらはArangoDBサーバーでテストされていないため、いくつかのタイプミスが存在する可能性があります。

+0

私はそれを動的に行うことはできません。私は時には名前とcreatedAtフィールドでソートする必要があります。それぞれのケースを別々に書く順番があまりにも多くあります。他のクエリと再利用したいと思います。このような文字列を動的に作成する関数を書くことはできますが、dbクエリを呼び出すときにはjs aqlタグを使用できません。あなたはarangoで簡単に並べ替えることができないのは残念です。( – MatiK

+0

並べ替えは簡単です。Foxxを使用したり、AQLを動的に生成して送信することができない理由はありますか? –

+0

Foxxを使用できません。クライアントの制約の中で、動的に生成されたAQLはjs aqlタグでは機能しません。 。 – MatiK

関連する問題