我如何加快MongoDB中的这个MongoDB查询?

我有一个树形的模式,指定一个父母的集合,和一个孩子的集合。

孩子的集合可能会有数以百万计的文档 – 每个文档都包含less量的数据,并且对其所属的父类的引用存储为string(也许是我的第一个错误)。

父母的collections要小得多,但可能还有数以万计,随着时间的推移会慢慢增长。 一般来说,单亲可能只有10个孩子,或多达5万(可能更多,但不太可能)。

一个单独的子文档可能看起来像这样:

{ _id: ObjectId("507f191e810c19729de860ea"), info: "Here's some info", timestamp: 1234567890.0, colour: "Orange", sequence: 1000, parent: "12a4567b909c7654d212e45f" } 

其相应的父logging(位于单独的集合中)可能如下所示:

 { _id: ObjectId("12a4567b909c7654d212e45f") info: "Blah", timestamp: 1234567890.0 } 

我在mongoose(其中包含请求中的父ID)查询如下所示:

 /* GET all children with the specified parent ID */ module.exports.childrenFromParent = function(req, res) { parentID = req.params.parentID; childModel.find({ "parentid": parentID }).sort({"sequence": "asc"}).exec( function(err, children) { if (!children) { sendJSONResponse(res, 404, { "message": "no children found" }); return; } else if (err) { sendJSONResponse(res, 404, err); return; } sendJSONResponse(res, 200, children); } ); }; 

所以基本上发生的事情是,查询必须search整个孩子的集合中的任何文档,其父母与所提供的ID相匹配。

我目前将这个父ID作为一个string保存在子集合模式(在上面的代码中的childModel),这可能是一个坏主意,但是,我的API在请求中提供父ID作为string。

如果任何人有任何想法,我可以修复我的模式或改变查询来提高性能,这将不胜感激!

写下评论:

您可以通过在parent字段中添加索引来帮助加快和优化查询。 您可以通过执行以下操作来添加(升序)索引:

 db.collection.createIndex( { parent: 1 } ) 

您可以通过将.explain("executionStats")到查询来分析索引的好处。 有关更多信息,请参阅文档 。

在大集合上添加索引可能需要时间,您可以通过运行以下查询来检查状态:

 db.currentOp( { $or: [ { op: "query", "query.createIndexes": { $exists: true } }, { op: "insert", ns: /\.system\.indexes\b/ } ] } ) 

编辑:如果按sequencesorting,则可能需要parentsequence添加复合索引 。

你为什么不在你的exec之前使用.lean()? 你真的想要所有的文件都是Mongoose文件吗?或者只是简单的JSON文件? 随着精益()你不会得到所有与Mongoose文件来的额外的getter和setter。 这可以很容易地从响应时间中删除至less一两秒钟。