Я не могу воспроизвести это с помощью следующего сценарий:
$m = new MongoClient();
$m->test->foo->drop();
$rs = $m->test->foo->batchInsert(
[
(object) ['_id' => 1],
(object) ['_id' => 2],
],
['continueOnError' => true]
);
echo "batchInsert returned:\n";
var_dump($rs);
echo "\ntest.foo contents:\n";
var_dump(iterator_to_array($m->test->foo->find()));
Это сообщает об успешном GLE ответ (ok
1 в переменной $rs
) и в конечном счете, печатает как документы, которые были только что вставленные в коллекцию. Игра с самими документами и continueOnError
вела себя так, как ожидалось. Так, например, в качестве continueOnError
false
со следующей партией:
[
(object) ['_id' => 1],
(object) ['_id' => 1],
(object) ['_id' => 2],
]
... даст исключение обработки второго документа. Третий документ никогда не вставлен. С continueOnError
как true
, мы по-прежнему получаем исключение, но третий документ вставлен.
Еще одна мысль заключалась в попытке отладки с помощью логгеров потока. Измените указанный выше сценарий, добавив следующую строку в MongoClient:
function log_batchinsert($server, $docs, $options, $info) {
var_dump(func_get_args());
}
$ctx = stream_context_create([
'mongodb' => ['log_batchinsert' => 'log_batchinsert'],
]);
$m = new MongoClient(null, [], ['context' => $ctx]);
$m->test->foo->drop();
$rs = $m->test->foo->batchInsert(/* ... */);
Это даст дополнительную отладочную водителя, когда операция batchInsert посылается через провод (ваши результаты могут немного отличаться):
array(4) {
[0]=>
array(5) {
["hash"]=>
string(25) "localhost:27017;-;.;10494"
["type"]=>
int(1)
["max_bson_size"]=>
int(16777216)
["max_message_size"]=>
int(48000000)
["request_id"]=>
int(1276292850)
}
[1]=>
array(2) {
[0]=>
object(stdClass)#4 (1) {
["_id"]=>
int(1)
}
[1]=>
object(stdClass)#5 (1) {
["_id"]=>
int(2)
}
}
[2]=>
array(1) {
["flags"]=>
int(1)
}
[3]=>
array(1) {
["continueOnError"]=>
bool(true)
}
}
Здесь функция регистрирует некоторую информацию о подключении к серверу, сам пакетный пакет (обратите внимание, что он берет верх, мы используем stdClass
) и флаги для операции OP_INSERT. Второй аргумент (т. Е. Пакет) будет вашим лучшим инструментом (за исключением мониторинга сетевого трафика), чтобы точно увидеть, что драйвер отправил MongoDB.
оба объекта и без ошибок. Lib также является последним – ArchieTiger