坚持和刷新-教义和MongoDB

坚持和刷新-教义和MongoDB,mongodb,doctrine,Mongodb,Doctrine,flush()有多快?我使用persist()将数千项添加到集合中,然后清空集合,然后刷新它 $dm = $this->get('doctrine.odm.mongodb.document_manager'); while(stuff)) { $item = new Item(); $item->setItem("item stuff"); $dm->persist($item); } $qb = $dm->crea

flush()有多快?我使用persist()将数千项添加到集合中,然后清空集合,然后刷新它

$dm = $this->get('doctrine.odm.mongodb.document_manager');

while(stuff))
{
     $item = new Item();
     $item->setItem("item stuff");           
     $dm->persist($item);
}

$qb = $dm->createQueryBuilder('Bundle:Item')->remove();
$query = $qb->getQuery();
$query->execute();

$dm->flush(); 

我想知道这些藏品有多少时间是空的。在删除和刷新之间。

我创建了一个基准,用于分析不同批量大小的简单双字段文档的刷新:

正如您所期望的,实际上将数据插入Mongo只占这些度量的一小部分。条令将花费相当多的时间遍历事件调度和变更集计算等步骤,后者将受到域模型复杂性的显著影响


您可以通过查看来跟踪
flush()
中所有特定于条令的操作。

更新数据库需要相当长的时间。。。因此,最好创建另一个临时集合,然后在刷新时将其重命名为production。哦,好吧。由于
db.collection.renameCollection()
不允许您覆盖现有集合,您可能需要使用
db.eval()
进行删除和重命名,这将有效地阻止数据库并以原子方式执行。我这样做了:
$parameters=parse_ini_文件($this->get('kernel')->getRootDir()“/config/parameters.ini”)$m=new\Mongo($parameters['Mongo_server'],数组('timeout'=>15000))$m->selectDB($parameters['mongo_database'])->selectCollection('current_collection')->drop()$m->admin->command(数组(“重命名集合”=>$parameters['mongo\u database'..”。新建集合“=>$parameters['mongo\u database'.]”。当前集合”)我使用条令进行插入,但无法使用条令重命名。有条令方法吗?条令没有用于重命名表的API,但它公开了MongoDB和MongoCollection方法(条令仅包装驱动程序类)。在上面的代码中,drop/rename不是原子的,因此另一个查询理论上可以在drop或rename操作之间访问当前的_集合。不过,我敢打赌这对你来说不是问题。否则,使用驱动程序中的
db.eval()
(或
MongoDB::execute()
),您可以在服务器端JS中执行拖放和重命名,这将以原子方式阻止和执行。更多信息:
$ php src/benchmark.php 10 100 1000 10000 20000 50000 100000
Flushing     10 items took  0.014058 seconds and   2097152 bytes
Flushing    100 items took  0.024325 seconds and    524288 bytes
Flushing   1000 items took  0.196992 seconds and   5505024 bytes
Flushing  10000 items took  2.563700 seconds and  57933824 bytes
Flushing  20000 items took  6.291873 seconds and  89915392 bytes
Flushing  50000 items took 19.118011 seconds and 240386048 bytes
Flushing 100000 items took 58.582809 seconds and 469499904 bytes