如何删除MongoDB复制缓冲区集合中的文档

时间:2016-10-10 16:05:15

标签: php mongodb

我在项目中使用PHP + Mongo 3.2.9。

这个项目每天都有数百万个文档,每天都有很多新录音。 为了优化我的数据库,我使用一个缓冲区集合来存储记录ID,只将新文档保存在另一个集合中。

为此,我尝试开发一个删除重复录制的优化脚本,注意删除字段较少的文档。

缓冲区集合(不带_id):

[
{
    label : "red",
    added : true
},
{
    label : "yellow",
    added : true
},
{
    label : "pink"
},
{
    label : "blue"
},
{
    label : "green"
},
{
    label : "grey"
},
{
    label : "pink",
    added : true
},
{
    label : "blue",
    added : true
},
{
    label : "green"
},
{
    label : "red"
},
{
    label : "blue"
}
]

以上面的例子为例: 这里有一系列颜色。有些人的状态是"添加了#34;其他一些没有。 我想要一个脚本,每个颜色只允许一个文档,特别是添加了"的文件:true"字段,如果存在。

结果应该是:

[
{
    label : "red",
    added : true
},
{
    label : "yellow",
    added : true
},
{
    label : "green"
},
{
    label : "grey"
},
{
    label : "pink",
    added : true
},
{
    label : "blue",
    added : true
}
]

我想用2个php脚本处理:

$m = new MongoDB\Driver\Manager('mongodb://localhost:27017/?w=0');

// script 1  
$filter = ['added' => [ '$exists' => true ]];

$q = new MongoDB\Driver\Query($filter);
$rows = $m->executeQuery('db.buffer', $q);

forEach ($rows as $r) {

    $b = new MongoDB\Driver\BulkWrite;

    $f = [ 'label' => $r->label, 'added' => [ '$exists' => false ] ];

    $b->delete($f);

    if (count($b) > 0) {
        $result = $m->executeBulkWrite('db.buffer', $b);
    }
}

// script 2:
$filter = ['added' => [ '$exists' => false ]];

$q = new MongoDB\Driver\Query($filter);
$rows = $m->executeQuery('db.buffer', $q);

forEach ($rows as $r) {

    $b = new MongoDB\Driver\BulkWrite;

    $f = [ '_id' => [ '$gt' => $r->_id ], 'label' => $r->label];

    $b->delete($f);

    if (count($b) > 0) {
        $result = $m->executeBulkWrite('db.buffer', $b);
    }   
}

但实际上这种方式太长了(特别是第二个脚本)而且由于处理时间结束而导致致命错误。

我确信有更好的方法可以改善这个过程。

感谢您帮助我解决此问题。

0 个答案:

没有答案