1

在 Mongo 中,假设我有一个mycollection包含字段ab和的集合huge。我经常想在 上执行查询、mapreduce、更新等a,并且b偶尔也想huge在查询结果中返回。

我知道这db.mycollection.find()将扫描整个集合并导致 Mongo 尝试将整个集合添加到工作集中,这可能会超过我可用的 RAM 量。

如果我改为调用db.mycollection.find({}, { a : 1, b : 1 }),这是否仍会导致将整个集合添加到工作集中或仅将我的投影条款添加到工作集中?

4

1 回答 1

3

MongoDB 可以使用称为覆盖查询的东西:http: //docs.mongodb.org/manual/applications/indexes/#create-indexes-that-support-covered-queries这些允许您从索引加载所有值,而不是磁盘或内存,如果这些文档当时在内存中。

请注意,您不能在全表扫描中使用覆盖查询,条件、投影和排序都必须在索引内;IE:

db.col.ensureIndex({a:1,b:1});
db.col.find({a:1}, {_id:0, a:1, b:1})(.sort({b:1}));

会工作(排序在括号中,因为它不是完全需要的)。_id如果您也打算返回它,您可以添加到您的索引中。

Map Reduce 不支持覆盖查询,据我所知,没有办法只将一定数量的字段投影到 MR 中;也许有一些我不知道的黑客。Map Reduce 仅$match在输入查询方面支持 like 运算符,并为传入查询的排序提供单独的参数(http://docs.mongodb.org/manual/applications/map-reduce/)。

请注意,对于更新,我相信只有原子操作:http ://docs.mongodb.org/manual/tutorial/isolate-sequence-of-operations/ (不包括findAndModify)不要将文档加载到您的工作集中,但是,相信是那里的关键字。

考虑到您需要对这些记录进行 MR 和正常查找和更新,我强烈建议您检查一下为什么要分页这么多数据,以及您是否真的需要经常这样做。似乎您正试图在短时间内频繁地进行过多的处理。

另一方面,如果这是一个每晚运行的脚本或其他什么,那么我不会太担心它过多的工作集(即记分板重新计算脚本)。

于 2013-01-21T21:36:44.813 回答