I know MongoDB is able to handle a lot of requests/sec, but let's say I have to query a lot of documents of a collection given their _id; what sounds better: making a $in on the _id attribute with all the ids I want to get, or loop over findOne queries?

Solution 1

I would definitely go with using the $in query and providing a array of _ids.

Example:

db.collection.find({
    "key": {
        "$in": [
            ObjectId("xxx"),
            ObjectId("yyy"),
            ObjectId("zzz")
        ]
    }
})

Why?

  • If you loop, there is a certain amount of setup and teardown for each query creating and exhausting cursors which would create overhead.
  • If you are not doing this on a local machine it also creates tcp/ip overhead for every request. Locally you could use domain sockets.
  • There is a index on "_id" created by default and collecting a group of documents to return in a batch request should be extremely fast so there is no need to break this up into smaller queries.

There's some additional documentation here if you want to check it out.

Solution 2

If You want to find directly with MongoChef UI you can use this query:

Field:{$in:[/Naveen Kumar/i, /Naveen/i, /Garshakurthy/i]}}