Mongodb 2.6.0-rc2和PHP 1.4.5 - 找到_id $ in

时间:2014-03-30 18:28:18

标签: php mongodb mongodb-php

像这样的简单查询:

$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相关?

谢谢!

2 个答案:

答案 0 :(得分:10)

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

这个特殊问题是https://jira.mongodb.org/browse/PHP-1051

的PHP驱动程序错误

当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 :(得分:2)

用mongo调试后,我注意到以下内容:

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

但它应该是

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

所以,我建议在调用$ in之前执行array_values($ VAR),我猜Mongo 2.4.9对于$ id可以是对象或数组的事实更宽松,请确保使用数组mongo 2.6;)