2014-01-02 6 views

ответ

0

Я не могу воспроизвести это с помощью следующего сценарий:

$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 вела себя так, как ожидалось. Так, например, в качестве continueOnErrorfalse со следующей партией:

[ 
     (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.

0

Первый параметр:

Массив массивов или объектов

(http://www.php.net/manual/en/mongocollection.batchinsert.php)

Is являются $document1 и $document2 массивы или объекты (и, если у них есть MongoID они не похожи друг на друга)?

Если вы не продолжаетеOnError, вы получаете какие-либо?

Если у вас есть последние обновления в Монго PHP Lib и выше вопросы не приводят к решению вы, возможно, нашли ошибку в LIBS ..

+0

оба объекта и без ошибок. Lib также является последним – ArchieTiger

Смежные вопросы