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

所以现在我被困住了。我认为 $group 中使用的 $min 和 $max 在这里无法帮助我......

任何想法 ?

4

1 回答 1

2

$minin 聚合是$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 回答