如何在 mongoDB 中使用吗啡获得累加器结果?

How to get Accumulator result using morphia in mongoDB?

我在 Java 中使用带有 MongoDB 的 Morphia,我喜欢像这样在聚合查询中获取大量记录:

AggregationPipeline pipCount = ds.createAggregation(MyTable.class)
            .match(query1)
            .match(query2)
            .unwind("transactions")
            .match(query3)
            .group("_id", grouping("_id"), grouping("count", new Accumulator("$sum", 1)));
Iterator<MyTable> result = pipCount.aggregate(MyTable.class);

我需要使用 grouping("_id") 来删除重复结果,然后对结果进行计数,但找不到任何方法来读取总和值... 任何想法?

示例数据:

{
    "_id": "00000222",
    "create_date": ISODate("2015-05-06T07:20:31.000+0000"),
    "update_date": ISODate("2015-05-06T07:20:31.000+0000"),
    "payment": 70.0,
    "fee": 0.0,
    "type": "RECURRING",
    "currency": "USD",
    "status": "OK",
    "transactions": [{
        "_id": "111111223",
        "amount": 1260.0,
        "fee_type": "VARIABLE_ADD",
        "fee_rate": 2.75,
        "status": "ERROR",
        "charges": [{
            "_id": "2222223344",
            "amount": 1000.0,
            "recurring": true,
            "firstTime": false,
            "oneTime": true,
        }, {
            "_id": "222222222233221",
            "amount": 70.0,
            "recurring": true,
            "firstTime": true,
            "oneTime": true,
        }]
    }],
    "users": {
        "_id": "33333333332212",
        "update_date": ISODate("2015-12-18T08:03:35.000+0000"),
        "user_id": "sdjfhsd@skjksdf.com",
        "first_name": "dsjfj",
        "last_name": "skdfjf",
    }
}

结果:1

你可以尝试这样的事情。您不需要额外的分组。第一组将在计算总和并投影计数并将响应映射到文档并读取计数时处理重复项。

import org.bson.Document; 

AggregationPipeline pipCount = datastore.createAggregation(MyTable.class)
            .match(query1)
            .match(query2)
            .unwind("somethingID")
            .match(query3)
            .group("_id", grouping("count", new Accumulator("$sum", 1)))
            .project(Projection.projection("count"));

    Iterator<Document> result = pipCount.aggregate(Document.class);

    while (result.hasNext()) {
        Document document = result.next();
        Integer count = document.getInteger("count");
    }