1
votes

Comment exécuter un script MongoDB4.2 js à l'aide des données Spring Mongodb ou Java MongoDriver

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


4 commentaires

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


3 Réponses :


0
votes

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.


0 commentaires

0
votes

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");


0 commentaires

0
votes

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 .


0 commentaires