如何使用php在mongo db中将两个不同的文档插入到同一个集合中? 我尝试了下面的代码,但它只插入了document1。
$NewCollection->batchInsert(
array($document1, $document2),
array('continueOnError' => true)
);
答案 0 :(得分:0)
第一个参数:
数组或对象数组
(http://www.php.net/manual/en/mongocollection.batchinsert.php)
是$document1
和$document2
数组或对象(如果它们有MongoID,它们的相同之处不一样)?
如果你没有continueOnError,你会得到任何吗?
如果你有Mongo PHP lib的最新更新,并且上述问题没有找到解决方案,你可能在libs中发现了一个错误..
答案 1 :(得分: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
变量中的$rs
为1)并最终打印刚刚插入到集合中的两个文档。使用文档本身,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的确切内容的最佳工具(缺少监控网络流量)。