如何将两个不同的文档插入到相同的mongo db集合中?

时间:2014-01-02 13:14:49

标签: php mongodb

如何使用php在mongo db中将两个不同的文档插入到同一个集合中? 我尝试了下面的代码,但它只插入了document1。

$NewCollection->batchInsert(
                array($document1, $document2),
                array('continueOnError' => true)
             );

2 个答案:

答案 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表现得如预期。例如,continueOnErrorfalse,包含以下批次:

    [
        (object) ['_id' => 1],
        (object) ['_id' => 1],
        (object) ['_id' => 2],
    ]

...将产生处理第二个文档的异常。永远不会插入第三个文件。如果continueOnErrortrue,我们仍会获得异常,但会插入第三个文档。

另外一个想法是尝试使用流上下文记录器进行调试。通过将以下内容添加到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的确切内容的最佳工具(缺少监控网络流量)。