MongoTemplate Requête tableau qui correspondent au moins les valeurs que je suis de passage

0

La question

Si j'ai un Documents définis comme

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

J'aimerais être capable de faire une requête avec MongoTemplate afin de passer d'une liste de valeurs telles que ["cool","incroyable"], et ont, en retour, la première collection ci-dessus, pas le second. Pour ce que je veux atteindre, l' condition de ne pas semble assez. J'ai essayé avec le $toute condition et de la Mongo console il fonctionne comme j'ai besoin, mais dans mon code quelque chose ne fonctionne pas et il prend une éternité pour ma requête à élaborer. Avec les de dollars en exploitant mon code va vite, à la place. Ma méthode dans mon référentiel (pour d'autres raisons, je dois faire une agrégation comme ci-dessous):

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());
    } 

En regardant cette réponse, j'ai essayé avec

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

Mais rien n'a changé, la requête prend une éternité et non pas avec la sortie attendue. Des idées s'il vous plaît? Merci!!!!

1

La meilleure réponse

0

Pour trouver si les balises de tableau champ contient tous les membres de youe tableau, vous pouvez utiliser le soufflet, si vous en avez besoin pour être à l'agrégation de pipeline utiliser la seconde.

Dans votre requête, vous avez plus de stades, et plus de code, si vous voulez demander plus si vous pouvez donner des exemples de données et la production prévue en JSON, et ce que vous voulez faire, afin que les gens peuvent aider.

Requête1

  • trouver de l'aide $all opérateur

Le code de Test ici

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

Query2

  • l'agrégation de la solution avec la différence

Le code de Test ici

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

Salut Takis, je vous remercie pour vos conseils! Ce dont j'ai besoin est de le faire avec Java, pas par Mongo console où il travaille déjà. Avec MongoTemplate que j'aurais du utiliser une Projection, et dans mon cas, je préfère rester avec l'Agrégation. Pour les exemples de code, j'ai juste besoin de joindre deux collections (Agrégation) et une requête sur un Tableau présent dans la "MyBook de la collection" que je joins en
Barbi

Dans d'autres langues

Cette page est dans d'autres langues

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