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

时间:2011-12-16 20:11:07

标签: performance mongodb

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

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

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

4 个答案:

答案 0 :(得分:14)

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

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

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

答案 1 :(得分:8)

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

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

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

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

答案 2 :(得分:2)

我做了一个新答案来评论这个事实:

由@ peterscodeproblems在接受的答案中评论。

findAndModify(query=<document>, remove=True)

正如documentation指出的那样。

由于它是原生的,原子的,我希望这是更快的方法。

答案 3 :(得分:-4)

我是mongodb的新手并不完全确定您的查询尝试做什么,但这是我将如何做的

# suppose database is staging
# suppose collection is data
use staging
db.data.remove(<your_query_criteria>)

地图在哪里,可以包含您想要的任何搜索条件

不确定这是否对您有帮助。