简体   繁体   中英

mongoose query using sort and skip on populate is too slow

I'm using an ajax request from the front end to load more comments to a post from the back-end which uses NodeJS and mongoose. I won't bore you with the front-end code and the route code, but here's the query code:

Post.findById(req.params.postId).populate({
    path: type, //type will either contain "comments" or "answers"
    populate: {
        path: 'author',
        model: 'User'
    },
    options: {
        sort: sortBy, //sortyBy contains either "-date" or "-votes"
        skip: parseInt(req.params.numberLoaded), //how many are already shown
        limit: 25 //i only load this many new comments at a time.
    }
}).exec(function(err, foundPost){
    console.log("query executed"); //code takes too long to get to this line
    if (err){
        res.send("database error, please try again later");
    } else {
        res.send(foundPost[type]);
    }
});

As was mentioned in the title, everything works fine, my problem is just that this is too slow, the request is taking about 1.5-2.5 seconds. surely mongoose has a method of doing this that takes less to load. I poked around the mongoose docs and stackoverflow, but didn't really find anything useful.

Using skip-and-limit approach with mongodb is slow in its nature because it normally needs to retrieve all documents, then sort them, and after that return the desired segment of the results.

What you need to do to make it faster is to define indexes on your collections.
According to MongoDB's official documents:

Indexes support the efficient execution of queries in MongoDB. Without indexes, MongoDB must perform a collection scan, ie scan every document in a collection, to select those documents that match the query statement. If an appropriate index exists for a query, MongoDB can use the index to limit the number of documents it must inspect.
-- https://docs.mongodb.com/manual/indexes/

Using indexes may cause increased collection size but they improve the efficiency a lot.

Indexes are commonly defined on fields which are frequently used in queries. In this case, you may want to define indexes on date and/or vote fields.


Read mongoose documentation to find out how to define indexes in your schemas: http://mongoosejs.com/docs/guide.html#indexes

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM