web-dev-qa-db-ja.com

Spring --mongodb --aggregation-'cursor 'オプションが必要です

次の集計パイプラインを実行します。

public void getMostLikedItems () {
        UnwindOperation unwind = Aggregation.unwind("favoriteItems");
        GroupOperation group = Aggregation.group("favoriteItems").count().as("likes");
        SortOperation sort = Aggregation.sort(Sort.Direction.DESC, "likes");

        Aggregation aggregation = newAggregation(unwind, group, sort);
        DBObject result = mongoTemplate.aggregate(aggregation, "users", LikedItem.class).getRawResults();
}

次の例外をスローします。

com.mongodb.MongoCommandException: Command failed with error 9: 'The 'cursor' option is required, except for aggregate with the explain argument' on server localhost:27017. The full response is { "ok" : 0.0, "errmsg" : "The 'cursor' option is required, except for aggregate with the explain argument", "code" : 9, "codeName" : "FailedToParse" }

ここでのカーソルオプションの意味がわかりません。このオプションはどこに設定する必要がありますか?

[〜#〜] edit [〜#〜]これはサンプルのユーザードキュメントです

{
  "_id": "5a6df13552f42a34dcca9aa6",
  "username": "user1",
  "password": "$2a$10$p0OXq5PPa41j1e4iPcGZHuWjoKJ983sieS/ovFI.cVX5Whwj21WYi",
  "favoriteItems": [
    {
      "_id": "5a0c6b2dfd3eb67969316d6d",
      "name": "item1",
      "city": "Rabat"
    },
    {
      "_id": "5a0c680afd3eb67969316d0b",
      "name": "item2",
      "city": "Rabat"
    }
  ]
}
5
Hamza

ドキュメントから。

MongoDB 3.4は、パイプラインにexplainオプションが含まれていない限り、カーソルオプションなしのaggregateコマンドの使用を非推奨にします。集計コマンドを使用して集計結果をインラインで返す場合は、デフォルトのバッチサイズカーソル{}を使用してカーソルオプションを指定するか、カーソルオプションカーソル{batchSize:}でバッチサイズを指定します。

Spring Mongo 2.xバージョンでは、batchSizeAggregationOptionsを渡すことができます

Aggregation aggregation = newAggregation(unwind, group).withOptions(newAggregationOptions().cursorBatchSize(100).build());

デフォルトのバッチサイズ

Aggregation aggregation = newAggregation(unwind, group).withOptions(newAggregationOptions().cursor(new Document()).build());
2
Sagar Veeram
'The 'cursor' option is required, except for aggregate with the explain argument'

互換性のないバージョンのMongoDBとSpring-data-mongoを使用している場合、Springデータでこのタイプのエラーが発生します。

Explain、カーソル引数を使用してrawResultsを取得できます。

Aggregation aggregation = Aggregation.newAggregation(group).withOptions( new AggregationOptions(allowDiskUse, explain, cursor));

//try with .withOptions( new AggregationOptions(true,false,new Document()));

コメント付きの引数を渡すと、結果はrawResultになりますが、指定されたoutType.classにはマップされません。

マップされた結果を取得するには、MongoDbのバージョンに応じてSpring-Dataバージョンの正しい依存関係をダウンロードする必要があります。

[〜#〜]編集[〜#〜]

Springバージョン5.0.およびSpring-data-mongoDBバージョン2.0.を使用しました。正常に動作しています。

1
Adarsh Patel

カーソルの提供は必須であるため、出力モードをカーソルとして提供できます。

List<DBObject> list = new ArrayList<DBObject>();
list.add(unwind.toDBObject(Aggregation.DEFAULT_CONTEXT));
list.add(group.toDBObject(Aggregation.DEFAULT_CONTEXT));
list.add(sort.toDBObject(Aggregation.DEFAULT_CONTEXT));

DBCollection col = mongoTemplate.getCollection("users");

Cursor cursor = col.aggregate(list, AggregationOptions.builder().allowDiskUse(true).outputMode(OutputMode.CURSOR).build());

List<AggregationResultVO> result = new ArrayList<AggregationResultVO>();

while(cursor.hasNext()) {
     DBObject object = cursor.next();
     result.add(new AggregationResultVO(object.get("aggregationResultId").toString()));
}
0
Pratik Saxena