Preserving Insertion Order in Java Collections and Querying MongoDB with Java

When working with data collections and databases, maintaining the correct order and efficiently querying your data are crucial. Recently, I faced two common issues: querying for a specific array element in MongoDB and preserving insertion order when converting a stream to a set in Java. Let's dive into how to solve these problems.

Querying for the First Element in a MongoDB Array

In MongoDB, you might need to query a document to check if a specific value is the first element in an array. This can be achieved with a simple query, without needing the $elemMatch operator. Here's how you can do it:

MongoDB Query:

db.collection.find({
  "arrayField.0": "desiredValue"
})

In this query:

Using MongoTemplate and Criteria in Java

To perform the same query in a Spring Boot application using MongoTemplate and Criteria, follow these steps:

Java Implementation:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;

@Service
public class YourService {

    @Autowired
    private MongoTemplate mongoTemplate;

    public List<YourDocumentClass> findDocumentsWithFirstArrayElement(String desiredValue) {
        Query query = new Query();
        query.addCriteria(Criteria.where("arrayField.0").is(desiredValue));
        return mongoTemplate.find(query, YourDocumentClass.class);
    }
}

In this example:

Preserving Insertion Order in Java Collections

Another common issue is preserving the insertion order when collecting elements into a set. Using a regular HashSet will not maintain the order, but a LinkedHashSet will. Here’s how you can convert a stream to a LinkedHashSet:

Original Code:

travelPlan.setCityIds(plan.getCityDetails().stream()
    .map(CityDetails::getCityId)
    .collect(Collectors.toSet()));