MongoDB - 使用reduce在组内限制


MongoDB - Limit within a group with reduce

我是Mongodb的新手,我想知道如何限制组调用(PHP)中的结果。经过一番研究,我发现唯一的方法就是写一个"减速器"

这是我目前拥有的

    $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 相同的结果。我做错了什么?

相当于 SQL LIMIT 的 MongoDB 通常是游标方法limit()skip()。不幸的是,PHP 驱动程序MongoCollection::group返回结果集而不是游标。但您可以改为使用 MongoCollection::aggregate 并使用包含三个运算符的聚合管道:

  1. 按分组条件$group
  2. $limit只拿前100名
  3. $skip忽略前两个

这些示例对数据结构使用 JSON 语法,但将它们转换为 PHP 的关联数组语法应该不难。

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