Je mets à jour mongodb 3.4 vers mongodb 4.2
Dans mongoDB 4.2, la commande eval n'existe plus
Avant de pouvoir exécuter ce qui suit avec mongodb 3.4
String script = "db.firstColl.find({'_id':'573fcafd-584d-447c-a762-53567283b2b0'}).forEach(function(x) { var fact = x.data.fact; print(fact);});" ScriptOperations scriptOps = mongoTemplate.scriptOps(); ExecutableMongoScript echoScript = new ExecutableMongoScript(script); return scriptOps.execute(echoScript);
3 Réponses :
Vous pouvez utiliser l'annotation spring-data-mongodb
features @Query
dans le référentiel Mongo pour écrire la requête du shell Mongo et l'exécuter telle quelle, comme ci-dessous:
eg:
import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.stereotype.Service; import sample.data.mongo.models.Course; @Service public class CustomFindQueryExecutor { @Autowired private MongoTemplate mongoTemplate; public void RunCustomQuery() { String query2 = "{\"name\" : \"mathematics\"}"; List<Course> courseList = (List<Course>) mongoTemplate.find(new CustomFindPreparator(query2), Course.class, "course"); System.out.println(courseList); } }
Ce qui précède est juste pour des exemples et après avoir obtenu les données de cette requête, vous pouvez faire ce que vous voulez.
Une autre façon de faire ceci est d'écrire les deux classes une pour le préparateur de requête à partir de JSON et une autre pour l'exécuteur comme ci-dessous:
Classe de préparation de requête p>
import org.springframework.data.mongodb.core.query.Query; public class CustomFindPreparator extends Query { private String jsonOperation; public CustomFindPreparator(String jsonOperation) { this.jsonOperation = jsonOperation; } }
Classe d'exécuteur de requête
@Query("{'organization' : ?0, 'active' : true, 'fields' : {$elemMatch : {'key' : ?1, 'value' : {$regex : ?2, $options: 'i'}}}}") List<Springdata> findFieldDataByRegexMatch(String org, String key, String pattern); @Query("{'organization' : ?0, 'active' : true, 'fields' : {$elemMatch : {'key' : ?1, 'value' : {$regex : ?2, $options:'si'}}}}") List<Springdata> getDataByQueryAnnotation(String org, String key, String pattern);
Dans la chaîne String query2
vous pouvez passer n'importe quelle requête du shell Mongo, puis l'exécuter dans spring-data-mongodb.
Pour plus de détails sur l'implémentation, vous pouvez visiter ma page Github: Lien Vous devez principalement vérifier les classes CustomFindPreparator et CustomFindQueryExecutor uniquement.
Une solution que j'ai pu trouver est la suivante
public Object responseQuery(){ StringBuilder query = new StringBuilder("{ "); query.append("find: 'impCollection', "); query.append("filter: { 'data.est':'ACEPTADA','data.ver':0}, "); query.append("projection: { 'data.docSop': 1, 'security': 1}, "); query.append("sort: { 'security.fecCre': 1 }, "); query.append("limit: 5 "); query.append("} "); return nativeQuery(query.toString()); }
}
public Object nativeQuery(String query) { CommandResult commandResult = mongoTemplate.executeCommand(query); Map cursor = (Map)commandResult.get("cursor"); return cursor.get("firstBatch");
La commande eval a été supprimée sans remplacement dans MongoDB Server 4.2.0.
En savoir plus sur Documentation Spring-Mongo ou Documentation officielle de Mongo .
Au lieu de l'imprimer, vous devriez le mettre dans une liste, puis l'imprimer en utilisant
System.out.println ();
Le problème n'est pas tant l'impression. Le problème est qu'il ne peut plus exécuter de scripts mongo
Veuillez vérifier la réponse ci-dessous pour mieux expliquer, comment exécuter les requêtes personnalisées. J'espère que cela résoudra votre problème.
J'ai vérifié cela dans la version MongoDB
4.0.14