【问题标题】:Find request with MongoDB/CakePHP return id:null使用 MongoDB/CakePHP 查找请求返回 id:null
【发布时间】:2026-01-16 15:55:02
【问题描述】:

我需要使用 cakePHP 和 MongoDB 数据库运行一个简单的请求。我使用ichikaway/cakephp-mongodb 插件。插入没问题,但这个简单的请求:

$this->Category->find('first', array('conditions' => array('name_cat' =>  "Cars")));

给我:

array('Category' => array('id' => null))        

但是“汽车”在我的数据库中:

{
    "_id" : ObjectId("54ad46e919d056cc7b483430"),
    "facebook_id" : "1",
    "name_cat" : "Cars"
} 

我已经测试了在模型中添加“hint”参数或定义$primaryKey,但结果是一样的。

感谢您的帮助。

编辑:

经过一些研究,我发现每个请求“find”的最后一个 Item 都被替换为 id:null 的 Item。 如果我的数据库中有 2 项“汽车”:

$this->Category->find('All', array("conditions" => array("name_cat" => "Cars")));

给我:

array(
(int) 0 => array(
    'Category' => array(
        'facebook_id' => '1',
        'name_cat' => 'Cars',
        'id' => '54ad46e919d056cc7b483430'
    )
),
(int) 1 => array(
    'Category' => array(
        'id' => null
    )
)

)

【问题讨论】:

    标签: php mongodb cakephp


    【解决方案1】:

    我查看了插件源代码,发现 MongoCursor::getNext() 函数将最后一项设为 NULL。该函数在请求执行后在 read() 函数中调用。

    所以我使用了iterator_to_array()函数,结果很好。

    MogodbSource.php 中的旧代码(第 1168 到 1180 行)

    while ($return->hasNext()) {
        $mongodata = $return->getNext();
        [...]
    }
    

    新代码:

    $cursor_mongo = iterator_to_array($return);
    foreach ($cursor_mongo as $mongodata) {
        [...]
    }
    

    这个新代码对我有用。

    【讨论】: