我在命令行上使用 MongoDB 来循环遍历一组特定条件的文档,从一个集合移动到另一个集合并从原始集合中删除。
db.coll1.find({'status' : 'DELETED'}).forEach(
function(e) {db.deleted.insert(e); db.coll1.remove({_id:e._id}); });
这可行,但是我需要编写脚本,以便每天(或每小时)通过 cron 脚本将 coll1 中的所有文档移动到已删除的集合中。我正在使用 PHP,所以我想我会编写一个使用 Mongo PHP 库的脚本::
$db->execute('db.coll1.find({'status' :'DELETED'}).forEach(
function(e) { db.deleted.insert(e); db.coll1.remove({_id:e._id}); })');
这可行,但与 Mongo 命令行不同,db->execute() 被评估,这会导致锁定直到执行块完成,这会阻止对集合的所有写入。我不能在我的生产环境中这样做。
有没有办法(无需手动登录 Mongo 并运行命令)并通过 PHP 脚本执行而不锁定?
如果我使用:
db->selectCollection('coll1')->find(array('status' => 'DELETED'))
并遍历,我可以选择文档,保存到已删除的集合并从 coll1 集合中删除。然而,这似乎需要大量带宽来拉取客户端上的所有内容并将其保存回服务器。
有什么建议么?