我在项目中使用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);
}
}
但实际上这种方式太长了(特别是第二个脚本)而且由于处理时间结束而导致致命错误。
我确信有更好的方法可以改善这个过程。
感谢您帮助我解决此问题。