1

我正在构建一个使用 mongoDB 进行操作存储的 ETL 应用程序。ETL 过程从数据源执行频繁的增量转储,有时还会执行全表转储。

当我执行完全转储时,我想替换整个 mongoDB 集合 - 索引和所有。

PHP 教程建议使用这种方法插入多个文档:

<?php
$connection = new MongoClient();
$collection = $connection->database->collectionName;

for ( $i = 0; $i < 100; $i++ )
{
    $collection->insert( array( 'i' => $i, "field{$i}" => $i * 2 ) );
}
?>

但是,如果我有数百万个文档,这会导致与 mongoDB 的数百万个连接——这显然是一个很大的瓶颈,尤其是在远程数据库上。更不用说我是否想等待来自数据库的回调确认插入成功。

PHP驱动程序支持的mongoDB中是否有一种方法可以用一个大数组替换整个集合,从而对数据库执行一次调用?我想这对于 mongoDB 也会更快,例如db.colleciton.drop()vs. db.collection.remove().

如果这不可能,那么在运行 PHP 脚本的同一台服务器上拥有一个主数据库并远程复制它会更有效吗?通过这种方式,我可以从本地数据库获得更快的响应,并且复制时会有一些滞后,但我想这会使 PHP 脚本更早可用。

有什么建议么?

谢谢,

通用汽车

4

1 回答 1

4

但是,如果我有数百万个文档,这会导致数百万个与 mongoDB 的连接

不,只有一个连接。它不会在每次迭代后关闭连接。

更不用说我是否想等待来自数据库的回调确认插入成功。

事实上,没有简单的方法可以解决这个问题。如果你想知道实际插入的东西,你必须……嗯,知道。

我想这对于 mongoDB 也会更快,例如 db.colleciton.drop() 与 db.collection.remove()。

由于 MongoDB 的内部结构和它释放记录对象的方式(一个很好的介绍:http ://www.10gen.com/presentations/storage-engine-internals )drop()在这种情况下性能更高,因为它实际上“丢弃”了集合直接关闭。不仅如此,所有的记录对象都将不复存在,并且该集合将作为一个空闲范围存在,等待再次使用。

用一个大数组替换整个集合,从而对数据库执行一次调用?

删除集合后,您始终可以使用batchInserthttp://php.net/manual/en/mongocollection.batchinsert.php )。但是,如果事情失败了,你就会遇到奇怪的事情,你需要回退的场景。逐一插入,您实际上可以通过一次调用来判断事情是否应该继续或是否需要干预。

这里有一些关于索引的注释,删除索引并在插入数据后重建它们。这种方式要快得多。

如果这不可能,那么在运行 PHP 脚本的同一台服务器上拥有一个主数据库并远程复制它会更有效吗?

这取决于。通常在工作集上,您是否可以在您的应用服务器上实际运行 MongoDB。另一个考虑因素是单点故障,您的辅助服务器将被疏远,您将依赖mongod应用服务器上的单点故障来为您带来此好处;所以如果有故障转移,你就不会保持这个优势。

从理论上讲,在本地托管的有空闲时间之后的某个时间,没有什么可以阻止您这样做并使用RP_PRIMARYand w1 in并复制辅助节点。MongoClientmongod

于 2013-02-08T15:09:33.420 回答