2017-02-21 9 views
0

Javaドライバを使用して集約フレームワークを使用してMongoDbクエリを変換しようとしています。私はここでクエリを作成するのに役立ちましたHow to apply filter for output of aggregation framework of Mongo Db?。ここで集計クエリをMongoDbからBasicDbObjectに変換するJava

は、サンプルの集計クエリです:

db.movies.aggregate(
[{ 
    $redact: { 
     $cond: { 
      if: {$gt: [{ $avg: "$customerReviews"}, 7 ] }, 
      then: "$$KEEP", 
      else: "$$PRUNE" 
     } 
    } 
}, 
{$skip:1}, 
{$limit:2} 
] 
); 

私が使用を開始:

BasicDBObject avgQuery = new BasicDBObject("$avg", "$customerReviews"); 

しかし、{$ GTを実行する方法を見つけ出すことはできません:[{$の平均: "$ customerReviewsを"} 、 7 ] }。私はgtQuery.put(avgQuery、new BasicDbObject( "$ gt"、7))のようなものでなければならないと思うが、明らかにput()関数にString以外のものを入れることはできない。

Btw、私は$ redactがBasicDbObjectのみを使って行うことができないか、またはSpring Mongoを使用するMongo spring query where two fields are equalのようなものが必要かどうか分かりません。誰かが私が全体のクエリを取得するのを助けることを願っています。

答えて

2

BasicDBObjectは古い2.x mongoバージョンクラスです。より新しい3.x apiクラスを使用してください。

javaドライバにredactパイプラインを作成するヘルパークラスはありません。

MongoClient mongoClient = new MongoClient(); 
MongoDatabase database = mongoClient.getDatabase("dbname"); 
MongoCollection<Document> collection = database.getCollection("dbcollection"); 
List<Document> results = collection.aggregate(Arrays.asList(
      new Document("$redact", new Document("$cond", 
        Arrays.asList(new Document("$gt", 
        Arrays.asList(new Document("$avg", "$customerReviews"), 7)), 
        "$$KEEP", "$$PRUNE"))), 
      Aggregates.skip(1), 
      Aggregates.limit(2) 
)).into(new ArrayList<>()); 

別の方法としては、使用することができます

String redact = "{\n" + 
      " $redact: {\n" + 
      "  $cond: {\n" + 
      "   if: {$gt: [{ $avg: \"$customerReviews\"}, 7 ] },\n" + 
      "   then: \"$$KEEP\",\n" + 
      "   else: \"$$PRUNE\"\n" + 
      "  }\n" + 
      " }\n" + 
      "}"; 

List<Document> results = collection.aggregate(Arrays.asList(
      Document.parse(redact), 
      Aggregates.skip(1), 
      Aggregates.limit(2) 
)).into(new ArrayList<>()); 
関連する問題