我试图在mongodb中插入100万条记录需要花费很多时间 说它可以这么快告诉我,我的代码有什么问题 我使用php来做到这一点
$m = new MongoClient();
$db = $m->mydb;
echo "Database mydb selected";
$collection = $db->createCollection("mycol");
echo "Collection created succsessfully";
$collection = $db->mycol;
echo "Collection selected succsessfully";
for ($i=0; $i<1000000; $i++)
{
$document = array(
"title" => "MongoDB".$i,
"description" => "database",
"likes" => 100,
"url" => "http://www.tutorialspoint.com/mongodb/",
"by" => "tutorials point"
);
$collection->insert($document);
}
echo "Document inserted successfully";
答案 0 :(得分:2)
<?php
$m = new MongoClient();
$db = $m->mydb;
echo "Database mydb selected";
$collection = $db->createCollection("mycol");
$db = $m->mydb;
echo "Database mydb selected";
$collection = $db->mycol;
$batchSize = 1000;
$documents = array();
for ($i=0; $i<1000000; $i++)
{
$documents[] = array(
"title" => "MongoDB".$i,
"description" => "database",
"likes" => 100,
"url" => "http://www.tutorialspoint.com/mongodb/",
"by" => "tutorials point"
);
// If we've reached `$batchSize` entries, perform the batched insert.
if (($i+1) >= $batchSize)
{
$collection->batchInsert($documents);
$documents = array();
}
}
// Finish the last batch.
if (!empty($documents))
{
$collection->batchInsert($documents);
}
在这里,我们一次插入1000条记录(可通过$batchSize
调整)。这需要MongoDB 2.6或更高版本。
答案 1 :(得分:2)
您可以使用MongoDB 2.6及更高版本提供的Bulk Operations API来利用插入操作。当前的PHP驱动程序应该支持这些方法,特别是您需要 MongoWriteBatch
类进行插入操作,特别是使用 MongoInsertBatch
<创建一个Insert Write Batch / strong> class:
<?php
$mc = new MongoClient("localhost");
$collection = $mc->selectCollection("test", "category");
$batch = new MongoInsertBatch($collection);
$counter = 0;
for($i=0; $i<1000000; $i++) {
$document = array(
"title" => "MongoDB".$i,
"description" => "database",
"likes" => 100,
"url" => "http://www.tutorialspoint.com/mongodb/",
"by", "tutorials point"
);
$batch->add($document);
$counter++;
if ( $counter % 1000 === 0 ) {
$ret = $batch->execute(array("w" => 1));
$counter++;
$batch = new MongoInsertBatch($collection);
}
}
if ( $counter > 0 ) {
$ret = $batch->execute(array("w" => 1));
}
?>
在上面,在for循环中创建的每个文档都被添加到插入操作中,然后通过.add()
方法将其添加到批处理中,并且仅在调用{{1}时发送到服务器}}。有序写入操作按照提供的顺序发送到服务器,以便串行执行。如果写入失败,则将中止任何剩余操作。
有一些&#34;尺寸&#34;的管理。使用模运算实现的这些操作,通常应由驱动程序处理,但如果要检查写入结果,则将其保持在可管理的大小。
这里的关键是,不是等待来自服务器的每次更新的写响应,而是发送操作并在批量生成中响应#34;。减少&#34;开销&#34;在这里进行大规模更新是相当可观的,因为来回减少&#34;来回&#34;与服务器通信时。