web-dev-qa-db-fra.com

Spring - mongodb - aggregation - L'option 'curseur' est requise

Exécution du pipeline d'agrégation suivant:

public void getMostLikedItems () {
        UnwindOperation unwind = Aggregation.unwind("favoriteItems");
        GroupOperation group = Aggregation.group("favoriteItems").count().as("likes");
        SortOperation sort = Aggregation.sort(Sort.Direction.DESC, "likes");

        Aggregation aggregation = newAggregation(unwind, group, sort);
        DBObject result = mongoTemplate.aggregate(aggregation, "users", LikedItem.class).getRawResults();
}

lève l'exception suivante: 

com.mongodb.MongoCommandException: Command failed with error 9: 'The 'cursor' option is required, except for aggregate with the explain argument' on server localhost:27017. The full response is { "ok" : 0.0, "errmsg" : "The 'cursor' option is required, except for aggregate with the explain argument", "code" : 9, "codeName" : "FailedToParse" }

Je ne comprends pas ce que l'on entend par l'option du curseur ici. Où cette option doit-elle être configurée?

EDITVoici un exemple de document utilisateur

{
  "_id": "5a6df13552f42a34dcca9aa6",
  "username": "user1",
  "password": "$2a$10$p0OXq5PPa41j1e4iPcGZHuWjoKJ983sieS/ovFI.cVX5Whwj21WYi",
  "favoriteItems": [
    {
      "_id": "5a0c6b2dfd3eb67969316d6d",
      "name": "item1",
      "city": "Rabat"
    },
    {
      "_id": "5a0c680afd3eb67969316d0b",
      "name": "item2",
      "city": "Rabat"
    }
  ]
}
5
Hamza

De la docs.

MongoDB 3.4 déconseille l'utilisation de la commande d'agrégat sans le curseur option, à moins que le pipeline n'inclue l'option explicitée. Quand renvoyer des résultats d'agrégation en ligne à l'aide de la commande d'agrégat, spécifiez l'option de curseur à l'aide du curseur de taille de lot par défaut: {} ou spécifiez la taille du lot dans l'option de curseur cursor: {batchSize: }.

Vous pouvez passer batchSize avec AggregationOptions dans la version Spring Mongo 2.x

Aggregation aggregation = newAggregation(unwind, group).withOptions(newAggregationOptions().cursorBatchSize(100).build());

Avec taille de lot par défaut

Aggregation aggregation = newAggregation(unwind, group).withOptions(newAggregationOptions().cursor(new Document()).build());
2
Veeram
'The 'cursor' option is required, except for aggregate with the explain argument'

Ce type d'erreur est généré dans les données de printemps lorsque vous utilisez des versions incompatibles de MongoDB et de Spring-data-mongo.

Bien que vous puissiez obtenir rawResults avec une explication, des arguments de curseur.

Aggregation aggregation = Aggregation.newAggregation(group).withOptions( new AggregationOptions(allowDiskUse, explain, cursor));

//try with .withOptions( new AggregationOptions(true,false,new Document()));

En passant par les arguments commentés, vous obtiendrez le résultat dans rawResult mais il ne sera pas mappé dans outType.class.

Pour obtenir un résultat cartographié, vous devez télécharger la dépendance de la version de Spring-data en fonction de votre version de MongoDb. 

MODIFIER

J'ai utilisé Spring version 5.0.3 et Spring-data-mongoDB version 2.0.3 Il fonctionne très bien.

1
Adarsh Patel