¿Cómo filtrar documentos basados en una matriz incrustada?

Despues de revisaresta página, específicamente esta consulta

db.scores.find(
   { results: { $elemMatch: { $gte: 80, $lt: 85 } } }
)

Usé las siguientes importaciones

import static com.mongodb.client.model.Filters.and;
import static com.mongodb.client.model.Filters.elemMatch;
import static com.mongodb.client.model.Filters.eq;
import static com.mongodb.client.model.Projections.excludeId;
import static com.mongodb.client.model.Projections.fields;
import static com.mongodb.client.model.Projections.include;

Y se me ocurrió el siguiente código para realizar una operación similar (ARRAY_FIELD_NAME = "myArray")

MongoCollection<Document> collection = mongoDB.getCollection(COLLECTION_NAME);

Bson filters = and(eq("userId", userId), elemMatch(ARRAY_FIELD_NAME, eq("id", id)));
Bson projections = fields(include(ARRAY_FIELD_NAME), excludeId());

List<Document> results = (List<Document>) collection.find(filters).projection(projections).first().get(ARRAY_FIELD_NAME);
if (CollectionUtils.isEmpty(results)) {
    return null;
}
if (results.size() > 1) {
    throw new ApiException(String.format("Multiple results matched (User ID: %s, Array item ID: %s)", userId, id));
}
return results.get(0);

Para filtrar documentos que tienen la siguiente estructura

{
    "_id": {
        "$oid": "588899721bbabc26865f41cc"
    },
    "userId": 55,
    "myArray": [
        {
            "id": "5888998e1bbabc26865f41d2",
            "title": "ABC"
        },
        {
            "id": "5888aaf41bbabc3200e252aa",
            "title": "ABC"
        }
    ]
}

Pero en lugar de obtener un solo elemento o ninguno delmyArray campo, siempre consigo ambos artículos!

El único código que funcionó para mí es el siguiente

MongoCollection<Document> collection = mongoDB.getCollection(COLLECTION_NAME);

List<Bson> aggregationFlags = new ArrayList<>();
aggregationFlags.add(new Document("$unwind", "$" + ARRAY_FIELD_NAME));
aggregationFlags.add(new Document("$match", new Document("userId", userId).append(ARRAY_FIELD_NAME + ".id", id)));
aggregationFlags.add(new Document("$project", new Document("_id", 0).append(ARRAY_FIELD_NAME, "$" + ARRAY_FIELD_NAME)));

return (Document) collection.aggregate(aggregationFlags).first().get(ARRAY_FIELD_NAME);

Entonces, ¿por qué la primera parte del código que debería comportarse igual que la consulta que se muestra al comienzo de la pregunta, no filtra los resultados como se esperaba?

No necesito "agregar" resultados, necesito "filtrarlos" usando la identificación del usuario y la identificación del elemento de la matriz.

Respuestas a la pregunta(1)

Su respuesta a la pregunta