2017-10-03 17 views
1

ループバックサーバーからデータを照会するには、admin-on-restでフルテキストフィルターを使用します。 私はドキュメント(AOR-doc)から例を実装しようとしましたが、私は残念ながら、単一のフィールドを照会するために管理している:ループバックサーバーでadmin-on-restでフルテキストフィルターを使用する方法

const CatFilter = (props) => (
    <Filter {...props}> 
    <TextInput label="Search" source="CatCode" alwaysOn /> 
    </Filter> 
); 

は、どのように私は、複数のフィールド間でのフルテキスト検索を実行するには、ループバックのバックエンドを使用することができます可能であれば "contains"文字列を検索します。

答えて

2

これを行うには2つの方法がありますが、私は以下の両方を概説しています。

1)ループバック全文検索では、正規表現検索を行うカスタムリモートメソッドが必要です。

https://loopback.io/doc/en/lb3/Where-filter.html

正規表現のセクションへのジャンプ。

これは、LBでテキスト検索を行うための最良の方法でした。

これはこれは、API側で次の形式のフィルタを生成し、私のフィルタ

const AdminFilter = (props) => { 
    return (<Filter {...props}> 
    <TextInput label="Name Or Email" source="userNameOrEmailId" alwaysOn /> 
    </Filter>) 
} 

です。

const findUsersByNameOrEmail = (filter) => { 
    const regex = '^' + filter.where.userNameOrEmailId 
    filter.where.or = [{name: {'regexp': regex}}, {email: {'regexp': regex}}] 
    delete filter.where.userNameOrEmailId 
    return findAllUsersByFilter(filter) 
} 

const findAllUsersByFilter = (filter) => { 
    return AppUser.find(filter) 
} 

ここで私はちょっとハッキーですが、上記のuserNameOrEmailのようなフィルタにダミーソースを割り当てると思います。それは実際にはデフォルトの懸念をオーバーライドしていません。適切なフィルタを設定するのに役立ちます。

2)カスタムRest Wrapperまたは自分自身のRest Clientで上記の関数findUsersByNameOrEmailによって行われているフィルタ構築のようなことを行うことで、同じことを達成することもできます。あなたの残りのクライアントやラッパーには以下のようなものがあります。

if (type === 'GET_LIST' && resource === 'appUser') { 
    const regex = '^' + params.userNameOrEmailId 
    const url = `URLroot/filter={where: [or: {name: {'regexp': regex}}, {email: {'regexp': regex}}] 
    options.method = 'GET'; 
    return handleRequestAndResponse(url, options) 
} 

あなたのAPIへの呼び出しをインターセプトし、必要に応じて事前に修正することです。

+0

しかし、どのように私は、管理者・オン・残りの部分と正規表現を使用することができますか? –

+0

Admin Restでは唯一の仕事は文字列をAPIに渡すことです。そのカスタム文字列を取得してRegexSearchに渡すのは、カスタムのRemote Methodの仕事です。私の答えをいくつかの詳細で編集します。 –

+0

ちょうど私はちょうど上で概説したテキスト/ IDベースの正規表現検索とアプローチ2を実装しなければなりませんでした。遠隔の方法にしたくない場合は、それを試すこともできます。 –

1

最後に、私はうまくいくと思われる解決策を見つけたと思います。解決策が他の人を助けたり、私に間違いを知らせるように、私は何か問題を見落とさないことを願っています。 まず私は、フルテキストクエリ「q」をキャッチし、直接データベースクエリを作る金型モデルname.jsでaccess operation-hookを作成するMongoDB

ループバックで
db.collection.createIndex({ "$**": "text" }) 

Text Indexを作成しました:

Clinic.observe('access', function logQuery(ctx, next) { 
    console.log('Accessing %s matching %s', JSON.stringify(ctx.Model.modelName), JSON.stringify(ctx.query.where)); 

    if (ctx && ctx.query && ctx.query.where && ctx.query.where.q) { 
     ctx.query.where = 
     {$text: 
     { 
     search: ctx.query.where.q, 
     language: "de", 
     caseSensitive: false, 
     diacriticSensitive: false 
     } 
    } 
    } 
    next(); 
    }); 

管理オン残りのコードでフィルタの例のように推移している:

const CatFilter = (props) => { 
    return (<Filter {...props}> 
    <TextInput label="Full Text Search" source="q" alwaysOn /> 
    </Filter>) 
} 
関連する問題