Notes on "Introduction to MongoDB" on MongoDB University
I started learning about MongoDB on Codecademy, but there were technical difficulties blocking my progress. So I switched to MongoDB University, the free online learning platform hosted by MongoDB themselves. There was a bit of a learning curve on idiosyncrasies of MongoDB's learning platform, but I got the hang of it soon enough and could focus on the information covered by "Introduction to MongoDB" course.
Each section of the course starts with a Wistia-hosted video. I prefer to learn by reading at my own pace over watching a video, so this wasn't my favorite. The video sometimes has captions allowing us to read along with the spoken narrative, but the presence of captions was inconsistent. Sometimes the video is followed by a page of text covering the same information and I thought I could read that text and skip the video, only to find that sometimes the text is missing information covered by the video and vice versa. I end up having to do both video and repetitive text, which feels like a tremendously inefficient way to do things.
Another inefficiency are the hands-on labs powered by Instruqt. It takes several clicks and a few tens of seconds for the lab environment to spin up, which isn't bad by itself except most of our exercises involve typing out a single mongosh (MongoDB Shell) command and exiting to proceed to the next lab. This implementation means we spend a lot of time twiddling our thumbs waiting for spin-up and tear-down overhead, I would have preferred that we do more in each Instruqt session, so we don't spend so much time waiting.
As for the course material, it's not technically just about the MongoDB database itself, the course is also a sales pitch for associated MongoDB products. Mainly MongoDB Atlas, the cloud-hosted (your choice of AWS, Azure or GCP) MongoDB service that cost money for us and generates revenue for the company. I don't mind a company making sure we know how to give them money, but I don't care for the fact that MongoDB Atlas features are intermingled with MongoDB core functionality in this course. When we run our own MongoDB instance (which I plan to do for my own projects) we won't have Atlas functionality, but this course doesn't always make clear what is core MongoDB versus functionality added by Atlas. I expect the company would say "Don't need to bother, just use Atlas for your projects, we have a free tier!" and I appreciate that the offer exists. But I'm rather skeptical that their "Free Forever" tier will actually stay free given the discouraging historical record of free tiers.
Instructions in MongoDB mostly concentrate on what we can type into mongosh, which exposes a JavaScript style interface for interacting with a database. That is very different from storing SQL commands in strings as we did in node-sqlite. Compared to SQL syntax, I found it easier to remember and parse mongosh syntax because of its similarity to JavaScript. That said, I still come across things that feel inconsistent to me that catch me off guard. Some commands want us to specify an action first then where to store the results. {$count: "total_items"}
Other commands want us to specify the location of results followed by the action to generate it. {"total_items": {$count {}}}
Maybe there's a system and I just haven't learned them yet, certainly the course never tried to explain them.
At least I could still follow the logic for most of those inconsistencies. The one that completely confused me was an example using geographical location data in the form of { type: 'Point', coordinates: [ 40, -74 ] }
I think this is their GeoJSON format but the course didn't go into detail. The example then sorted by 'latitude
', and I don't see how I could have looked at 'type
' and 'coordinates
' and decide 'latitude
' is available for sorting. To my eye 'latitude
' was not defined at all! If I figure this out later, I'll add a URL here to the appropriate reference.
Here is my super-abbreviated variation of course syllabus:
- Querying for data with db.[collection].findOne() and find(). Followed by insert with insertOne() and insertMany(). We start with a few basic query operators using comparison operators $gt, $gte, $lt, and $lte. Then logical operators like $and and $or. We can use $elemMatch if we want to peer into values in the form of an array.
- Modifying data with replaceOne for direct replacement. updateOne() and updateMany() take operators like $set and $push. findAndModify() combines a common pattern of finding a single document, modifying it, and returning the results. Finally deleteOne() to remove documents.
- Tailor query results with cursor.sort() and limit(). Projection parameter to find() lets us skip information we're not interested in. And collection.countDocuments() is useful for data exploration.
- Aggregation is roughly analogous to SQL table joins. We are introduced to operators $match, $group, $sort, $limit, $project, $count, $set, and $out.
- Index helps us optimize lookup for specific query patterns. Recommend we list the fields in usage order of Equality, Sort, then Range. (But couse didn't explain why.) Like SQL, there's always some tradeoff involved for having a database index. The explain() command helps us see if an index is actually as helpful as expected.
- There's a whole arena of information on MongoDB anti-patterns. Like how we should be aware of BSON size limit of 16MB which means avoiding things like creating arrays that would grow unbounded.
This course gave me a solid start to using MongoDB in my projects. As I do not intend to rely on MongoDB Atlas staying free, I'm more likely to run the MongoDB Docker container on a test machine at home. Interactions with such a database would likely happen via mongosh and there are many ways to get it.