MongoDB查找和删除 - 最快的方式

Pet*_*ems 13 performance mongodb

我有一个简单的问题,从mongo集合中获取和删除对象的快速方法是什么.这是我目前的代码:

$cursor = $coll->find()->sort(array('created' => 1))->limit(1);
$obj = $cursor->getNext();
$coll->remove(array('name' => $obj['name']));
Run Code Online (Sandbox Code Playgroud)

正如您在上面所看到的,它从数据库中抓取一个文档并将其删除(因此不再处理它).不管这有多快,我都需要它更快地执行.挑战在于我们有多个流程在执行此操作并处理他们发现的内容但有时两个或多个流程会抓取同一个文档,从而产生重复.基本上我需要这样做,所以一个文件只能被抓取一次.所以任何想法都会非常感激.

mpo*_*ien 14

彼得,如果不了解所有情况,很难说这里最好的解决方案是什么 - 但是你可以使用的一种方法是findAndModify.这将查询单个文档并将其返回,并对其应用更新.

您可以使用它来查找要处理的文档,同时修改"状态"字段以将其标记为正在处理,以便其他工作人员可以识别它并忽略它.

这里有一个例子可能很有用:http: //docs.mongodb.org/manual/reference/command/findAndModify/

  • $db->command(array('findandmodify' => 'CollectionName', 'sort' => array('created' => 1),'limit' => 1, 'remove' => true)); (3认同)

Ant*_*ois 8

使用此处记录的findAndRemove函数:http://api.mongodb.org/java/current/com/mongodb/DBCollection.html

findAndRemove函数从mongo数据库中检索和对象,并在单个(原子)操作中将其删除.

findAndRemove(查询,排序[,选项],回调)

  • 查询对象用于从数据库中检索对象(请参阅collection.find())
  • sort参数用于对结果进行排序(如果找到多个结果)

  • 似乎在 MongoDB 3 java API findAndRemove 中已经被 findOneAndDelete() 替换了`TDocument findOneAndDelete(Bson filter, FindOneAndDeleteOptions options);` (2认同)