0

我有一个包含大量文档的网络应用程序。用户可以输入 id(有效的 MongoId / ObjectId),但如果用户不输入它,我必须使用最后一个 id 检索对象:

我担心搜索最后一个对象的速度。我目前正在这样做:

db.docs.find({"status": 1}).sort({"_id": -1}).limit(1);
//Or in php:
$docs->find(array('status' => 1))->sort(array('_id' => -1))->limit(1)->getNext();

这不是有点慢吗?首先是查找所有状态为 1 的文档,然后对它们进行排序并限制。有没有更好的方法来获取状态为 1 的最后一个文档?

4

2 回答 2

2

为了使这个性能更好,你可能需要在{ status: 1, _id: -1 }.

您还可以使用findOne而不是 find 与限制来简化语法:

db.docs.findOne({"status": 1}).sort({"_id": -1});
于 2012-09-19T15:46:01.177 回答
1

也许只是将另一个值存储在另一个表中,或者可能存储在内存缓存中,指示系统具有的最高 id 值,即 status=1。在数据库中插入/更新对象时,将需要添加少量逻辑,以将 status=1 的对象的 id 值与当前缓存的 id 值进行比较,如果值更高则更新。然后,您可以使用此缓存值直接访问最新文件。

find.sort.limit它有点笨拙,但随着对象数量的增加,它的性能可能比您当前正在执行的操作要好得多。

于 2012-09-19T15:41:19.580 回答