1. Overview

In this tutorial, we’ll take a look at a simple tagging implementation using Java and MongoDB.

For those unfamiliar with the concept, a tag is a keyword used as a “label” to group documents into different categories. This allows the users to quickly navigate through similar content and it’s especially useful when dealing with a big amount of data.

That being said, it’s not surprising that this technique is very commonly used in blogs. In this scenario, each post has one or more tags according to the topics covered. When the user finishes reading, he can follow one of the tags to view more content related to that topic.

Let’s see how we can implement this scenario.

2. Dependency

In order to query the database, we’ll have to include the MongoDB driver dependency in our pom.xml:

4. Updating Tags

Now that we have set up the database and inserted a couple of sample posts, let’s see how we can update them.

Our repository class will include two methods to handle the addition and removal of tags by using the title to find them. We’ll also return a boolean to indicate whether the query updated an element or not:

We used the addEachToSet method instead of push for the addition so that if the tags are already there, we won’t add them again.

Notice also that the addToSet operator wouldn’t work either since it would add the new tags as a nested array which is not what we want.

Another way we can perform our updates is through the Mongo shell. For instance, let’s update the post JUnit5 with Java. In particular, we want to add the tags Java and JUnit5 and remove the tags Spring and REST:

5. Queries

Last but not least, let’s go through some of the most common queries we may be interested in while working with tags. For this purpose, we’ll take advantage of three array operators in particular:

$in – returns the documents where a field contains any value of the specified array

$nin – returns the documents where a field doesn’t contain any value of the specified array

$all – returns the documents where a field contains all the values of the specified array

We’ll define three methods to query the posts in relation to a collection of tags passed as arguments. They will return the posts which match at least one tag, all the tags and none of the tags. We’ll also create a mapping method to handle the conversion between a document and our model using Java 8’s Stream API:

Again, let’s also take a look at the shell equivalent queries. We’ll fetch three different post collection respectively tagged with MongoDB or Stream API, tagged with both Java 8 and JUnit 5 and not tagged with Groovy nor Scala: