MongoTemplate Consulta de la matriz que coinciden, al menos, los valores que yo estoy pasando

0

Pregunta

Si tengo un Documentos definidos como

[
  {
    "title": "title",
    "tags": [ "cool", "amazing", "funny" ]
  },
  {
    "title": "another title",
    "tags": [ "nice", "amazing", "funny" ]
  }
]

Me gustaría ser capaz de consultar con MongoTemplate con el fin de pasar una lista de valores como la ["cool","increíble"] y en cambio la primera colección de arriba, no la segunda. Por qué me refiero a lograr, el $en condición no parece suficiente. He intentado con el $toda condición y de la de Mongo consola funciona como necesito, pero en mi código de algo que no está funcionando y se tarda una eternidad para mi consulta a elaborar. Con el $en el operador de mi código va rápido, en lugar. Mi método en mi repositorio (por otras razones, tengo que hacer una agregación de la siguiente):

public Page<MyDocument> findByProperties(String title, List<ObjectId> tags, Pageable page) {
        final List<Criteria> criteria = new ArrayList<>();
        Aggregation aggregation = null;

        
        if (title != null && !title.isEmpty()) {
            criteria.add(Criteria.where("title").is(title));
        }
        
        if (tags != null && !tags.isEmpty()) {
            criteria.add(Criteria.where("MyBook.tags").all(tags));
        }

        if (!criteria.isEmpty()) {
            aggregation = Aggregation.newAggregation(
                    Aggregation.lookup("from_collection", "_id", "idParent", "MyBook"),
                    Aggregation.unwind("MyBook"),
                    Aggregation.match(new Criteria().andOperator(criteria.toArray(new Criteria[0]))),
                    Aggregation.skip(page.getOffset()),
                    Aggregation.limit(page.getPageSize()),
                    Aggregation.sort(page.getSort())
            );
        } else {
            aggregation = Aggregation.newAggregation(
                    Aggregation.lookup("from_collection", "_id", "idParent", "MyBook"),
                    Aggregation.unwind("MyBook"),
                    Aggregation.skip(page.getOffset()),
                    Aggregation.limit(page.getPageSize()),
                    Aggregation.sort(page.getSort())
            );
        }

        List<MyDocument>  results  = mongoTemplate.aggregate(aggregation, "my_document", MyDocument.class).getMappedResults();

        return PageableExecutionUtils.getPage(results, page,
                () -> (long)results.size());
    } 

Mirando esta respuesta, he probado con

criteria.add(Criteria.where("MyBook.tags").in(tags).all(tags));

Pero nada cambió, la consulta tarda una eternidad y no con los resultados esperados. Alguna idea por favor? Gracias!

1

Mejor respuesta

0

Para saber si las etiquetas de campo de matriz contiene todos los miembros de youe matriz, puede utilizar el fuelle, si usted necesita para estar en la agregación de canalización de utilizar la segunda.

En su consulta tiene más etapas, y más código, si quieres preguntar más si se le puede dar datos de ejemplo y la salida esperada en JSON, y lo que quieres hacer, para que la gente pueda ayudar.

Consulta1

  • encontrar el uso de $all operador

El código de la prueba aquí

db.collection.find({"tags": {"$all": ["cool","amazing"]}})

Query2

  • la agregación de la solución con la diferencia de

El código de la prueba aquí

aggregate(
[{"$match": 
    {"$expr": 
      {"$eq": [{"$setDifference": [["cool", "amazing"], "$tags"]}, []]}}}])
2021-11-23 17:19:23

Hola Takis, gracias por tus consejos! Lo que necesito es hacerlo con Java, no a través de Mongo consola donde ya funciona. Con MongoTemplate yo tendría que usar una Proyección, y en mi caso yo prefiero seguir con la Agregación. Para los ejemplos de código, solo me falta juntar dos colecciones (Agregación) y una consulta en un Array presente en el "MyBook" de la colección de la que me unen a
Barbi

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................