DEV Community

Cover image for Easy hack to bypass MongoDB text search limit
Emanuel Lindström
Emanuel Lindström

Posted on

1

Easy hack to bypass MongoDB text search limit

TLDR: Periodically run a script and set a helper field on each document, adding text from multiple fields and make that field searchable.

Ok, it's not really a hack, just an easy method to circumvent the restriction MongoDB has that only lets you have a single field set to $text per collection.

Because MongoDB is a business that want to make money, they make some functionality available only via a paid premium license. This is totally fine, and most of the time you will manage great with all the wonderful, free utilities.

However, for my hobby project I wanted to free text search multiple fields in a single document and this isn't allowed in the free license. Instead of implementing Elastic Search, I managed to make it work with only MongoDB

In my project, a user would have basic information on his profile and I wanted to make their email searchable with a free text search. The user also has additional contact information such as city, street address and country, which I also wanted to make searchable via free text search. And finally, they would have a membership which included notes that I also wanted to make searchable.

My first approach, which I later abandoned was to make three collections: profiles, memberships and contactInfo. This allowed me to index one field per collection as a $text-field, making it searchable via a free text search. The problem with this approach is that my queries got very complex and super slow because I needed 3 queries each time I wanted a user's profile, membership and contactInformation. And I almost always want those together.

My second approach is a bit hacky, but works great! And it's totally within the bounds of what's allowed with a free license.

Firstly, I restructured my data model to a more NoSQL-ish pattern, where all the information needed together are in a single collection. I simply have a users collection with profile, contactInfo and membership information on it. With that, I get fast queries and a simple data model. The way I solved my need to free text search on multiple fields is quite easy; periodically run a script that calculates and writes a helper field called keywords which I build from other relevant fields on the document. I include notes, address, name, city, and any other fields I want and I have it indexed and set to $text.

This allows me to effectively search multiple fields in a single collection using MongoDB.

Speedy emails, satisfied customers

Postmark Image

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

Postgres on Neon - Get the Free Plan

No credit card required. The database you love, on a serverless platform designed to help you build faster.

Get Postgres on Neon

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay