[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
| [jnosql-dev] Weird MongoDBTemplate aggregate interface | 
  
  
    Hi all,
    Current MongoDBTemplate.aggregate interface is not aligned to
      jakarta NoSQL:
    https://github.com/eclipse/jnosql-databases/blob/e97f46e45e62634f6ec12efbe40ba743741ae725/jnosql-mongodb/src/main/java/org/eclipse/jnosql/databases/mongodb/mapping/MongoDBTemplate.java#L86
    It returns a stream of Mongo Document (as a Map<String,
      BsonValue>) which may be useful in some scenarios, but
      unfortunately can not be adopted to the NoSQL model.
      Converter helper classes like MongoDBUtils are not public, so
      there is no way to go for the model for aggregation method.
    My problem is that I can not limit select query an the only way
      to do it is using aggregate like:
    
    [
  { "$match": {} }
  { "$limit": 10 }
]
    
    IMHO this must be something:
      
      MongoDBDocumentManager:
        public Stream<DocumentEntity> aggregate(String
      collectionName, List<Bson> pipeline) {
              Objects.requireNonNull(pipeline, "filter is required");
              Objects.requireNonNull(collectionName, "collectionName is
      required");
              MongoCollection<Document> collection =
      mongoDatabase.getCollection(collectionName);
              AggregateIterable<Document> aggregate =
      collection.aggregate(pipeline);
              return stream(aggregate.spliterator(),
      false).map(MongoDBUtils::of)
                      .map(ds -> DocumentEntity.of(collectionName,
      ds));
          }
    MongoDBTemplate:
    
        <T> Stream<T> aggregate(String collectionName,
      List<Bson> pipeline);
          <T> Stream<T> aggregate(Class<T> entity,
      List<Bson> pipeline);
    
    DefaultMongoDBTemplate:
        @Override
          public <T> Stream<T> aggregate(String
      collectionName, List<Bson> pipeline) {
              Objects.requireNonNull(collectionName, "collectionName is
      required");
              Objects.requireNonNull(pipeline, "pipeline is required");
              return this.getManager().aggregate(collectionName,
      pipeline)
                      .map(this.converter::toEntity);
          }
      
          @Override
          public <T> Stream<T> aggregate(Class<T>
      entity, List<Bson> pipeline) {
              Objects.requireNonNull(entity, "entity is required");
              Objects.requireNonNull(pipeline, "pipeline is required");
              EntityMetadata entityMetadata = this.entities.get(entity);
              return this.getManager().aggregate(entityMetadata.name(),
      pipeline)
                      .map(this.converter::toEntity);
          }
    Kind regards,
    Dmitry