私の質問は非常に単純です。OPAlang の高レベル データベース API を使用して、MongoDB で GROUP BY like ステートメントを実行したいと考えています。でも、それは仕方ないと思います(?)
mongodb $group 操作を実行したい場合、必ず低レベル API を使用する必要がありますか ( stdlib.apis.mongo を使用しますか?)
最後に、低レベル API と高レベル API の両方を使用して MongoDB と通信できますか?
ありがとう。
私はちょうど別の考えを得た。
すべての MongoDB コマンド (たとえば、使用している「グループ」コマンド) は、という名前の仮想コレクションでアクセスできます$cmd
。サーバーにドキュメントを検索するように依頼するだけ{command_name: command_parameter, additional: "options", are: ["listed", "here"]}
です。単一の検索クエリで、Opa API ではまだサポートされていない MongoDB サーバーの優れた機能をすべて使用できるはずです。これには、バージョン 2.2 で導入された集約フレームワークと、バージョン 2.4 以降のベータ版の全文検索が含まれます。
たとえば、 new コマンドを使用して、クエリ文字列text
のコレクションをフルテキスト インデックスで検索したいとします。私は現在コードを使用しています(答えを解析し、見つかったドキュメントの-sを取得する関数はどこにありますか):coll_name
query
oncuccess
id
{ search: query, project: {_id:0, id:1}, }
|> Bson.opa2doc
|> MongoCommands.simple_str_command_opts(ll_db, db_name, "text", coll_name, opts)
|> MongoCommon.outcome_map(_, onsuccess, onfailure)
APIのソースコードを見てみると、Mongoにsimple_str_command_opts
実装されています。findOne()
しかし、代わりに高レベルの DB サポートを使用できます。
/test/`$cmd`[{text: coll_name, search: query, project: {_id: 0, id: 1}}]
あなたがしなければならないことは、以下を含むタイプで高レベルのDBコレクションを宣言することです:
text
コマンドの場合:
type commands = {
// command
string text,
// query
string search,
{
int _id,
int id,
} project,
// result of executing command "text"
string queryDebugString,
string language,
list({
float score,
{int id} obj,
}) results,
{
int nscanned,
int nscannedObjects,
int n,
int nfound,
int timeMicros,
} stats,
int ok,
// in case of failure (`ok: 0`)
string errmsg,
}
残念ながら、それは機能していません :(アプリケーションの起動時に、Opa ランタイム DB サポートは、セットの主キーの一意のインデックスを作成しようとします (次の例を{text, search, project}
参照)。
database test {
article /article[{id}]
commands /`$cmd`[{text, search, project}]
}
findOne()
ではなくを使用する必要があるため、主キーの使用が必要ですfind()
。仮想コレクションのインデックスを作成する$cmd
ことは許可されておらず、DB の初期化は失敗します。
Opa がインデックスを作成するのを止める方法が見つかれば、高レベルの API を使用するだけで、Mongo の優れた機能をすべて使用できるようになります ;)