2

コレクション内の他のドキュメントと比較して、1 つのドキュメントの一致スコアを計算しようとしています。mapReduce で動作しますが、aggregate を使用してこれが可能かどうかを知りたかった (10 倍高速と言われています)。

私のドキュメントは次のとおりです。

{
name: "John",
age: 27,
track: {
        section: 12, 
        start: 1,
        end: 4
        }
}

私が計算しようとしているスコアは単純ですmin(start_track_1, start_track_2) - max(stop_track_1, stop_track_2)

ジョンのスコアを計算するために、パイプラインを作成しようとしましたが、2 番目の演算子で既に失敗しています。

db.test.aggregate(
  { $match: {
    'age' : {$gte: 22, $lte: 34},
    'track.section': 12,
    }
  },
  { $project: { 
        _id : 1,
        name : 1,
        min_end: {$min: ["$track.end", 4]},
        max_start: {$max: ["$track.start", 1]}
     }
  }
)

シェルは次のように答えます。"errmsg" : "exception: invalid operator '$min'"

問題は、$min および $max 演算子が、$add および $subtract と同じように、配列に対して機能したことです...

だから今私は立ち往生しています。$group で使用される $min と $max は、ここでは役に立たないと思います...

何か案が ?

4

1 に答える 1

2

$minin Aggregation は の演算子です$group

条件演算子は、最小またはデフォルトの効果をもたらします。

を使用し$subtractて、次のパイプラインで計算を行うことができます$project

何かのようなもの:

db.foo.aggregate(
  { $group: { 
        _id : "$name",
        data_min: {$min: "$track.end"},
        data_max: {$max: "$track.start"}
     }
  },
  {
    $project:{
        _id: "$_id",
        score: { $subtract : [ 
            {$cond:[{$gt:["$data_max",1]},"$data_max",1]},
            {$cond:[{$lt:["$data_min",4]},"$data_min",4]}
        ]}
    }
  }
)
于 2013-04-11T18:52:31.090 に答える