【问题标题】:Mongodb 2.6.0-rc2 and PHP 1.4.5 - find _id $inMongodb 2.6.0-rc2 和 PHP 1.4.5 - 查找 _id $in
【发布时间】:2014-03-30 18:28:18
【问题描述】:

这样的简单查询:

$a = array('_id' => array( '$in' => array_values($ids) ) ); 
var_dump($a);
$cursor2 = $data->find( $a );

在 mongodb 2.4.9 中有效,但是在 2.6.0-rc2 中返回:

Type: MongoCursorException
Code: 17287
Message: Can't canonicalize query: BadValue $in needs an array

var_dump 的输出:

array(1) {
  ["_id"]=>
  array(1) {
    ["$in"]=>
    array(10) {
      [0]=>
      object(MongoId)#57 (1) {
        ["$id"]=>
        string(24) "52214d60012f8aab278eacb6"
      }
      [1]=>
      object(MongoId)#58 (1) {
        ["$id"]=>
        string(24) "52214d60012f8aab278eaca8"
      }
      [2]=>
      object(MongoId)#59 (1) {
        ["$id"]=>
        string(24) "52214d60012f8aab278eaca7"
      }
   }
}
}

我想知道这是 Mongo 还是 PHP 相关的?

谢谢!

【问题讨论】:

    标签: php mongodb mongodb-php


    【解决方案1】:

    这...是 MongoDB 2.6.0 中的一个更改,在 $in 子句中不再接受 bson 对象。

    这个特殊问题作为 PHP 驱动程序错误被跟踪 https://jira.mongodb.org/browse/PHP-1051

    当 PHP 数组为:顺序数字索引,从 0 开始

    时,MongoDB PHP 驱动程序会将 PHP 数组序列化为 BSON 数组(由 $in 运算符接受)

    这意味着如果你有一个类似的数组:

    $array = array($id0, $id1, $id2, $id3, $id4);
    

    然后你

    unset($array[0]);
    

    你实际上结束了:

    $array = array(1 => $id1, 2 => $id2, 3 => $id3, 4 => $id);
    

    它不以索引 0 开头。因此,MongoDB PHP 驱动程序将其转换为 BSON 对象...导致 MongoDB 中出现验证错误,因为它需要一个数组。

    现在,由于 MongoDB PHP 驱动程序不解析您的 MongoDB 查询,我们无法知道哪个数组应该不受此序列化规则的约束。

    如上所述,解决方法是确保您的 PHP 数组是数字索引的,从 0 开始。最简单的方法是运行

    array_values($values);
    

    【讨论】:

    • -1 抱歉,请检查有问题的代码,array_values 已被使用。
    • 这个答案帮助我解决了在 Laravel 中使用 jenssegers/laravel-mongodb 供应商时遇到的问题。我在他们的 Gitgub 帐户上发布了一个问题,并参考了这个答案以获得支持。谢谢!
    【解决方案2】:

    用 mongo 调试后,发现如下:

    ...查询:{ _id: { $in: { 0: ObjectId('52214d60012f8aab278eaad1') ...

    但应该是的

    ...查询:{ _id: { $in: [ ObjectId('52214d60012f8aab278eaad1') ...

    所以,我建议在调用 $in 之前执行 array_values($VAR),我猜 Mongo 2.4.9 对 $ids 可以是对象或数组这一事实更加宽容,请确保在mongo 2.6 ;)

    【讨论】:

    • array_values的精彩互动
    • -1,对不起,请检查代码,使用了array_values。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 2015-11-08
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    相关资源
    最近更新 更多