像这样的简单查询:
$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相关?
谢谢!
答案 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;)