MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Documentos aleatórios do MongoDB usando spring-data


Atualização:

A partir da v2.0 do Spring Data, você pode fazer isso:
SampleOperation matchStage = Aggregation.sample(5);
Aggregation aggregation = Aggregation.newAggregation(sampleStage);
AggregationResults<OutType> output = mongoTemplate.aggregate(aggregation, "collectionName", OutType.class);

Resposta original:

Camadas de abstração como spring-mongo sempre ficarão muito atrás dos recursos lançados pelo servidor. Portanto, é melhor construir você mesmo a estrutura do documento BSON para o estágio de pipeline.

Implemente em uma classe personalizada:
public class CustomAggregationOperation implements AggregationOperation {
    private DBObject operation;

    public CustomAggregationOperation (DBObject operation) {
        this.operation = operation;
    }

    @Override
    public DBObject toDBObject(AggregationOperationContext context) {
        return context.getMappedObject(operation);
    }
}

E depois use no seu código:
Aggregation aggregation = newAggregation(
    new CutomAggregationOperation(
        new BasicDBObject(
            "$sample",
            new BasicDBObject( "size", 15 )
        )
    )
);

Como isso implementa AggregationOperation isso funciona bem com os métodos auxiliares de operação de pipeline existentes. ou seja:
Aggregation aggregation = newAggregation(
    // custom pipeline stage
    new CutomAggregationOperation(
        new BasicDBObject(
            "$sample",
            new BasicDBObject( "size", 15 )
        )
    ),
    // Standard match pipeline stage
    match(
        Criteria.where("myDate")
            .gte(new Date(new Long("949384052490")))
            .lte(new Date(new Long("1448257684431")))
    )
);

Então, novamente, tudo é apenas um objeto BSON no final do dia. É apenas uma questão de ter um wrapper de interface para que os métodos de classe em spring-mongo interpretem o resultado e obtenham seu objeto BSON definido corretamente.