【问题标题】:Persist and flush - Doctrine and MongoDB持久化和刷新 - Doctrine 和 MongoDB
【发布时间】:2012-05-17 16:35:17
【问题描述】:

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(); 

我想知道收藏品会空置多长时间。在删除和冲洗之间。

【问题讨论】:

    标签: mongodb doctrine


    【解决方案1】:

    我创建了一个基准来分析不同批次大小的简单两字段文档的刷新:https://gist.github.com/2725976

    $ 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
    

    如您所料,实际上将数据插入 Mongo 只占这些测量的一小部分。 Doctrine 将花费相当多的时间来完成事件调度和变更集计算等步骤,后者将受到领域模型复杂性的显着影响。

    您可以通过查看 UnitOfWork::commit() 来跟踪 flush() 中所有特定于 Doctrine 的操作。

    【讨论】:

    • 更新数据库需要很长时间...所以最好创建另一个临时集合,然后在刷新时将其重命名为生产。哦,好吧。
    • 由于db.collection.renameCollection() 不允许您覆盖现有集合,您可能希望使用db.eval() 进行删除和重命名,这将有效地阻止数据库并自动执行。跨度>
    • 我这样做了:$parameters = parse_ini_file($this->get('kernel')->getRootDir() . '/config/parameters.ini'); $m = new \Mongo($parameters['mongo_server'], array('timeout' => 15000)); $m->selectDB($parameters['mongo_database']) ->selectCollection('current_collection') ->drop(); $m->admin->command(array("renameCollection" => $parameters['mongo_database'].".new_collection", "to" => $parameters['mongo_database'].".current_collection")); 我使用 Doctrine 进行插入,但无法使用 Doctrine 重命名。有没有教义的方法?
    • Doctrine 没有用于重命名表的 API,但它确实公开了 MongoDB 和 MongoCollection 方法(Doctrine 仅包装了驱动程序类)。在上面的代码中,删除/重命名不是原子的,因此理论上另一个查询可以在删除或重命名操作之间访问 current_collection。不过,我敢打赌,这对你来说不是问题。否则,使用db.eval()(或驱动程序中的MongoDB::execute()),您可以在服务器端JS 中进行drop 和rename,这将自动阻塞和执行。更多信息:mongodb.org/display/DOCS/Server-side+Code+Execution
    猜你喜欢
    • 1970-01-01
    • 2017-08-14
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多