2013-04-11 173 views
2

我嘗試計算一個文檔與我集合中其他文檔的匹配分數。它適用於mapReduce,但我想知道這是否可以使用聚合(據說速度提高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)

所以計算約翰的成績,我試圖創建我的管道,但在已經失敗第二運營商:

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 ...

所以現在我卡住了。我認爲在$組中使用$ min和$ max不能幫助我...

任何想法?

回答

2

$min聚合是$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]} 
     ]} 
    } 
    } 
) 
+0

非常感謝!我沒有想到這個解決方案! – ybycode 2013-04-12 09:38:20