MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Documenti casuali da MongoDB utilizzando spring-data

Aggiornamento:

A partire dalla v2.0 di Spring Data puoi farlo:

SampleOperation matchStage = Aggregation.sample(5);
Aggregation aggregation = Aggregation.newAggregation(sampleStage);
AggregationResults<OutType> output = mongoTemplate.aggregate(aggregation, "collectionName", OutType.class);

Risposta originale:

I livelli di astrazione come spring-mongo sono sempre in ritardo rispetto alle funzionalità rilasciate dal server. Quindi è meglio costruire tu stesso la struttura del documento BSON per la fase della pipeline.

Implementa in una classe personalizzata:

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 poi usa nel tuo codice:

Aggregation aggregation = newAggregation(
    new CutomAggregationOperation(
        new BasicDBObject(
            "$sample",
            new BasicDBObject( "size", 15 )
        )
    )
);

Poiché questo implementa AggregationOperation questo funziona bene con i metodi di supporto delle operazioni della pipeline esistenti. cioè:

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

Quindi, di nuovo, tutto è solo un oggetto BSON alla fine della giornata. Si tratta solo di avere un wrapper di interfaccia in modo che i metodi di classe in spring-mongo interpretino il risultato e ottengano correttamente l'oggetto BSON definito.