5

mongo-java-driver を使用して Java で集計操作を実行しようとしています。他の検索操作をいくつか実行しましたが、Java で次の集計を正しく実行できません。

db.I1.aggregate([
    { "$match": { "ci": 862222} },
    { "$match": { "gi": { "$ne": null } }},
    { "$group": {
        "_id": {
            "ci": "$ci",
            "gi": "$gi",
            "gn": "$gn",
            "si": "$si"
        }
    }},
    { "$group": {
        "_id": {
            "ci": "$_id.ci",
            "gi": "$_id.gi",
            "gn": "$_id.gn"
        },
        "sn": { "$sum": 1 }
    }},
    { "$sort" : { "_id.gi" : 1}}
])

Java でその集計を実行するためにいくつかの方法とメソッドを試しましたが、メソッドにグループ フィールド"ci", "gi", "gn","si"を正しく含めることができませんcoll.aggregate(asList())。これまでに得たものは次のとおりです。

MongoCollection<Document> coll = mongo.getCollection("I1");

Document matchCourse = new Document("$match",
    new Document("ci", Integer.parseInt(courseid)));

Document matchGroupNotNull = new Document("$match",
    new Document("gi", new Document("$ne", null)));

List<Object> list1 = new BasicDBList();
    list1.add(new BasicDBObject("ci", "$ci"));
    list1.add(new BasicDBObject("gi", "$gi"));
    list1.add(new BasicDBObject("gn", "$gn"));
    list1.add(new BasicDBObject("si", "$si"));

Document group1 = new Document(
    "_id", list1).append("count", new Document("$sum", 1));

List<Object> list2 = new BasicDBList();
list2.add(new BasicDBObject("ci", "$_id.ci"));
list2.add(new BasicDBObject("gi", "$_id.gi"));
list2.add(new BasicDBObject("gn", "$_id.gn"));

Document group2 = new Document(
    "_id", list2).append("sn", new Document("$sum", 1));

Document sort = new Document("$sort", 
    new Document("_id.gi", 1));

AggregateIterable<Document> iterable = coll.aggregate(asList(matchCourse,
    matchGroupNotNull, group1, group2, sort));

正しくないことはわかっていますが、私が何をしているのかを理解してもらうために含めました。これをさまざまな方法でグーグル検索し、いくつかのページを読みましたが、解決策は見つかりませんでした. MongoDB-Java( 1 , 2 ) の利用可能なドキュメントは私には短すぎて、このケースは含まれていません。

Javaでそのクエリを実行するにはどうすればよいですか? どんな助けでも大歓迎です。

どうもありがとうございました!!

4

2 に答える 2

1

この質問はかなり古いですが、私が検索したときにグーグルでトップマッチだったので、誰かがこれに対する解決策を探しているなら、私は次の方法でそれを行うことができました

Aggregation.group(Fields.fields()
            .and("field1")
            .and("field2"))
            .first("name")
            .`as`("name")
            .count().`as`("count")

これにより、次の MDB クエリが生成されます。

   { "$group" : 
        { "_id" : 
        { "field1" : "$field1", "field2" : "$field2"}, 
        "name" : { "$first" : "$name"}, 
        "count" : { "$sum" : 1}
   }
于 2020-05-06T11:28:24.183 に答える