Php Yii2:MongoDB选择跳过大值

Php Yii2:MongoDB选择跳过大值,php,mongodb,optimization,query-optimization,Php,Mongodb,Optimization,Query Optimization,我正在编写Yi2命令控制器,它将mongodb数据导出到sphinx(作为csv)。MongoDB控制器包含大约9M行,我添加了一个while循环 public function actionExportSphinx() { $query = new MongoQuery; $count = (int) $query->select(['_id']) ->from('test') ->c

我正在编写Yi2命令控制器,它将mongodb数据导出到sphinx(作为csv)。MongoDB控制器包含大约9M行,我添加了一个while循环

public function actionExportSphinx()
{
    $query = new MongoQuery;
    $count = (int) $query->select(['_id'])
                   ->from('test')
                   ->count();
    $i = 0;

    while($i < $count) {
        $rows = self::getExportData($i);
        self::printMongoRow($rows);
        unset($rows);
        $i += 100000;
    }
}
答案在评论中给出

在迭代整个MongoDb集合时,最好直接使用mongo查询游标,而不是跳过限制方法


当使用游标时,您只执行一次查询搜索,结果将以迭代方式获取到内存中

请显示self::getExportData($i)和self::printMongoRow($rows)的定义。@EvgenyS。向Question添加了代码。在您的例子中,最好使用mongo查询游标,而不是跳过限制方法。我不知道yii2 mongo包装是否为您提供了游标API,但使用MongoDB php驱动程序,您可以使用游标迭代整个集合。@EvgenyS它可以工作!谢谢你可以把它贴出来作为答案,我会接受它作为解决方案。好,让我们把它标记为答案。
public function printMongoRow($rows)
{
    foreach ($rows as $row) {
        printf("%d,\"%s\",\"%s\",\"%s\",\"%s\",%d,%d,%d\n",
            $row['_id'],
            (isset($row['lastname']) ? str_replace('"', "", $row['lastname']) : ""),
            (isset($row['firstname']) ? str_replace('"', "", $row['firstname']) : ""),
            (isset($row['middlename']) ? str_replace('"', "", $row['middlename']) : ""),
            (isset($row['town']) ? str_replace('"', "", $row['town']['title']) : ""),
            (isset($row['birthday']) ? $row['birthday'] : 0),
            (isset($row['birthmonth']) ? $row['birthmonth'] : 0),
            (isset($row['birthyear']) ? $row['birthyear'] : 0)
            );
    }
}

public function getExportData($i)
{
    $query = new MongoQuery;
        $query->select(['lastname', 'firstname', 'middlename', 'town', 'birthday', 'birthmonth', 'birthyear'])
                ->from('test')
                ->limit(100000)
                ->offset($i);
        return $query->all();
}