【发布时间】:2013-06-25 09:43:36
【问题描述】:
第一次来 - 请放轻松... ;)
我第一次开始使用 MongoDB - 使用官方 PHP 驱动程序与应用程序交互。 这是我遇到的关于聚合框架的第一个问题。 我有一个文档集合,所有文档都包含一个数字数组,如下面的缩短示例...
{
"_id": ObjectId("51c42c1218ef9de420000002"),
"my_id": 1,
"numbers": [
482,
49,
382,
290,
31,
126,
997,
20,
145
],
}
{
"_id": ObjectId("51c42c1218ef9de420000006"),
"my_id": 2,
"numbers": [
19,
234,
28,
962,
24,
12,
8,
643,
145
],
}
{
"_id": ObjectId("51c42c1218ef9de420000008"),
"my_id": 3,
"numbers": [
912,
18,
456,
34,
284,
556,
95,
125,
579
],
}
{
"_id": ObjectId("51c42c1218ef9de420000012"),
"my_id": 4,
"numbers": [
12,
97,
227,
872,
103,
78,
16,
377,
20
],
}
{
"_id": ObjectId("51c42c1218ef9de420000016"),
"my_id": 5,
"numbers": [
212,
237,
103,
93,
55,
183,
193,
17,
346
],
}
使用聚合框架和 PHP(我认为这是正确的方法),我试图计算出一个数字在再次出现之前没有出现在集合中(在 numbers 数组中)的平均次数. 例如,上例中没有出现数字 20 的平均次数是 1.5(有 2 个集合的间隙,然后是 1 的间隙 - 将这些值相加,除以间隙数)。 我可以确定数字 20 是否在结果数组中,然后使用 $cond 运算符,根据结果传递一个值。这是我的 PHP...
$unwind_results = array(
'$unwind' => '$numbers'
);
$project = array (
'$project' => array(
'my_id' => '$my_id',
'numbers' => '$numbers',
'hit' => array('$cond' => array(
array(
'$eq' => array('$numbers',20)
),
0,
1
)
)
)
);
$group = array (
'$group' => array(
'_id' => '$my_id',
'hit' => array('$min'=>'$hit'),
)
);
$sort = array(
'$sort' => array( '_id' => 1 ),
);
$avg = $c->aggregate(array($unwind_results,$project, $group, $sort));
我想要实现的是设置某种增量计数器,每次数字 20 出现在数字数组中时都会重置,然后获取所有这些数字并从那里计算出平均值……但我真的很难过.
我知道我可以从应用程序端的一组文档中计算出平均值,但理想情况下,我希望 Mongo 给我我想要的结果,这样它就更便携了。
Map/Reduce 是否需要参与其中?
收到任何帮助/建议/指针!
【问题讨论】:
-
当前版本做不到。
标签: php mongodb aggregation-framework