6

Web サーバーのログをMongoDBに保存すると、スキーマは次のようになります。

[
  {  
    "_id" : 12345,
    "url" : "http://www.mydomain.com/xyz/abc.html",
    ....
  },
  ....
]

コレクションを集計パイプラインに渡す前に、オペレーターを使用して$projectこのスキーマを少し再形成しようとしています。基本的に、後で group-by を実行するために使用される「type」という新しいフィールドを追加する必要があります。新しいフィールドのロジックは非常に単純です。

if "url" contains "pattern_A" then set "type" = "sales lead";
else if "url" contains "pattern_B" then set "type" = "existing client";
...

私はそれが次のようなものでなければならないと考えています:

db.weblog.aggregate(
  { 
    $project : {
      type : { /* how to implement the logic??? */ }
    }
  }
);

map-reduce を使用してこれを行う方法は知っていますが (「keyf」属性を上記のロジックを実装するカスタム JS 関数に設定することにより)、新しい集計フレームワークを使用してこれを実行しようとしています。式演算子を使用してロジックを実装しようとしましたが、これまでのところ機能しませんでした。どんな助け/提案も大歓迎です!

4

2 に答える 2

1

他の人が私のような同じニーズに遭遇した場合に備えて、私の「解決策」を共有しています。

@asya-kamsky がコメントの 1 つで提案したように、数週間調査した後、元の MongoDB スキーマに計算フィールドを追加することにしました。計算フィールドのロジックが変更されるたびに、一括更新を実行してコレクション内のすべてのドキュメントを更新する必要があるため、理想的ではありませんが、それはそれか、MapReduce を使用するようにコードを書き直すかのいずれかでした。とりあえず前者を選択。MongoDB Jira ボードを見ると、多くの人が$project演算子にさらに多様な演算子を追加するように求めているように見えます。MongoDB 開発チームが遅かれ早かれそれらを追加できるようになることを願っています。

区切り記号に基づいて文字列を分割する演算子。

新しい射影演算子 $elemMatch

$project で $slice 演算子を許可する

$inOrder 演算子を $project に追加します

于 2013-01-03T20:00:16.613 に答える
0

複数の演算子と式を組み合わせて使用​​する必要があります。

まず、の$cond演算子を$project使用すると、ifthenelseロジックを実装できます。

$cond:3つの要素の配列を取ります。最初はブール式、2番目と3番目はフィールド値に使用する値です。ブール式がtrueの場合、値に2番目の要素を使用し、そうでない場合は3番目の要素を使用します。

これらをネストして、3番目の要素自体$condがif-then-else-if-then-etcを取得する式になるようにすることができます。

文字列の操作は少し厄介ですが、$substr利用できます。

正確に試したことの例をいくつか投稿すると、うまくいかなかった理由を見つけることができるかもしれません。

于 2012-11-05T00:35:21.850 に答える