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!!!!