MongoDB - 使用reduce限制组内

时间:2013-09-10 08:57:56

标签: php mongodb

我是Mongodb的新手,我想知道如何限制组调用(PHP)中的结果。 经过一些研究,我发现唯一的方法是写一个“reducer”

这就是我目前所拥有的

    $reduce = "function (obj, prev) { ";
    $reduce .= "if(prev.count >= 2){";
    $reduce .= "prev.mailSubject = obj.mailSubject;";
    $reduce .= "}";
    $reduce .= "prev.count+=1;";
    $reduce .="}";
    $res = $this->db->forms->group(
                array('formid' => true),
                array('mailSubject' => ''),''),
                $reduce                                         
            );

似乎没有减少任何东西,我仍然得到了相同的结果,因为我没有把if放进去。我做错了什么?

1 个答案:

答案 0 :(得分:2)

与SQL LIMIT等效的MongoDB通常是游标方法limit()skip()。不幸的是,PHP驱动程序MongoCollection::group返回结果集而不是游标。但你可以做的是使用MongoCollection::aggregate并使用三个运算符的聚合管道:

  1. $group by your grouping criteria
  2. $limit to only take the first 100
  3. $skip to ignore the first two
  4. 这些示例对数据结构使用JSON语法,但将它们转换为PHP的关联数组语法应该不难。

    顺便说一下:您没有对结果进行排序。跳过通常仅在您按照某些条件对结果进行排序时才有意义,因为否则您将不知道将跳过哪些文档。 MongoDB返回文档的顺序未指定。它可能看起来像您的开发环境中的插入顺序,但这不能保证,并且在一些删除,更新和插入后将可靠地停止发生。如果要对结果进行排序,请将$sort添加到第1点和第2点之间的聚合管道。