MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Zufällige Dokumente aus MongoDB mit Spring-Data

Aktualisierung:

Ab Version 2.0 von Spring Data können Sie Folgendes tun:

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

Ursprüngliche Antwort:

Abstraktionsschichten wie Spring-Mongo werden immer weit hinter den vom Server veröffentlichten Funktionen zurückbleiben. Die BSON-Dokumentenstruktur für die Pipeline-Phase bauen Sie also am besten selbst auf.

Implementieren Sie in einer benutzerdefinierten Klasse:

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

Und verwenden Sie dann in Ihrem Code:

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

Da dies AggregationOperation implementiert Dies funktioniert gut mit den vorhandenen Hilfsmethoden für Pipelineoperationen. d.h.:

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

Also nochmal, am Ende des Tages ist alles nur ein BSON-Objekt. Es geht nur darum, einen Interface-Wrapper zu haben, damit die Klassenmethoden in Spring-Mongo das Ergebnis interpretieren und Ihr definiertes BSON-Objekt korrekt erhalten.