0

私の質問は非常に単純です。OPAlang の高レベル データベース API を使用して、MongoDB で GROUP BY like ステートメントを実行したいと考えています。でも、それは仕方ないと思います(?)

mongodb $group 操作を実行したい場合、必ず低レベル API を使用する必要がありますか ( stdlib.apis.mongo を使用しますか?)

最後に、低レベル API と高レベル API の両方を使用して MongoDB と通信できますか?

ありがとう。

4

2 に答える 2

0

私はちょうど別の考えを得た。

すべての MongoDB コマンド (たとえば、使用している「グループ」コマンド) は、という名前の仮想コレクションでアクセスできます$cmd。サーバーにドキュメントを検索するように依頼するだけ{command_name: command_parameter, additional: "options", are: ["listed", "here"]}です。単一の検索クエリで、Opa API ではまだサポートされていない MongoDB サーバーの優れた機能をすべて使用できるはずです。これには、バージョン 2.2 で導入された集約フレームワークと、バージョン 2.4 以降のベータ版の全文検索が含まれます。

たとえば、 new コマンドを使用して、クエリ文字列textのコレクションをフルテキスト インデックスで検索したいとします。私は現在コードを使用しています(答えを解析し、見つかったドキュメントの-sを取得する関数はどこにありますか):coll_namequeryoncuccessid

{ 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コレクションを宣言することです:

  1. クエリを作成するために使用するすべてのフィールド
  2. 可能な回答で取得できるすべてのフィールド。

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 の優れた機能をすべて使用できるようになります ;)

于 2013-09-22T11:03:25.540 に答える