sql >> データベース >  >> NoSQL >> MongoDB

spring-dataを使用したMongoDBからのランダムドキュメント

    更新:

    Spring Dataのv2.0以降、これを行うことができます:

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

    元の回答:

    spring-mongoのような抽象化レイヤーは、サーバーでリリースされた機能よりも常に遅れをとっています。したがって、パイプラインステージのBSONドキュメント構造を自分で作成するのが最善です。

    カスタムクラスで実装する:

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

    そして、コードで使用します:

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

    これはAggregationOperationを実装しているため これは、既存のパイプライン操作ヘルパーメソッドでうまく機能します。つまり:

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

    繰り返しになりますが、すべては1日の終わりにBSONオブジェクトにすぎません。 spring-mongoのクラスメソッドが結果を解釈し、定義されたBSONオブジェクトを正しく取得できるように、インターフェイスラッパーを用意するだけです。



    1. MongoDBのaggregate/group/sumクエリがpymongoクエリに変換されました

    2. ドキュメント内の別のフィールドの値でフィールドを更新します

    3. mongoカーソルを2回繰り返すことは可能ですか?

    4. RailsにMongoidを搭載したMongoDB-地理空間インデックス