mongodb shell到Java驱动程序的聚合语句

时间:2018-08-26 11:36:22

标签: driver shell java mongodb aggregation

我能够在mongo shell中运行一个汇总的MongoDb(3.8)请求,但无法使用Java驱动程序(3.4 java 8)来运行它。

这是输入源的结构。我想汇总信息以提供公司活动统计信息。请注意,文档说明了公司注册活动。我想将猿代码的前3位分组

{
    "_id" : "00552017600016",
    "sirene" : "005520176",
    "nic" : "00016",
    "natureCode" : "5710",
    "natureLabel" : "SAS, société par actions simplifiée",
    "name" : "HERNAS CARTONNAGE",
    "brand" : "",
    "registerDate" : ISODate("1954-12-31T23:00:00Z"),
    "startDate" : ISODate("1954-12-31T23:00:00Z"),
    "headquaters" : true,
    "address" : {
        "number" : 50,
        "ext" : null,
        "lane" : "RUE PASTEUR",
        "zipcode" : "80210",
        "city" : "FEUQUIERES EN VIMEU",
        "country" : "FRANCE",
        "location" : {
            "type" : "Point",
            "coordinates" : [
                1.60319694244078,
                50.0537636973407
            ],
            "accuracy" : 0,
            "ban" : "ADRNIVX_0000000260779642"
        }
    },
    "ape" : {
        "code" : "1721A",
        "label" : "Fabrication de carton ondulé"
    },
    "staff" : {
        "count" : 50,
        "year" : 2016
    }
}

在shell中运行此命令就像一个超级魅力

db.companies_geo.aggregate([ {$match:{"address.city":"LE MANS"}},  
{$group:{_id:{$substrBytes:["$ape.code",0,2]}, count:{$sum:1}, code:{$last:"$ape.code"}, label:{$last:"$ape.label"}}}, 
{$project:{count:1, code:1, label:1}}, 
{$sort:{count:-1}},
{$limit:20}
])

它产生这个结果

{ "_id" : "68", "count" : 4603, "code" : "6832B", "label" : "Supports juridiques de gestion de patrimoine immobilier" }
{ "_id" : "47", "count" : 1929, "code" : "4799B", "label" : "Vente par automate, aut. com. dét. hors mag., éventaire ou marché" }
{ "_id" : "94", "count" : 1874, "code" : "9499Z", "label" : "Autres organisations fonctionnant par adhésion volontaire" }
{ "_id" : "86", "count" : 1704, "code" : "8690F", "label" : "Activités de santé humaine non classées ailleurs" }
{ "_id" : "56", "count" : 832, "code" : "5630Z", "label" : "Débits de boissons" }
{ "_id" : "90", "count" : 816, "code" : "9004Z", "label" : "Gestion de salles de spectacles" }
{ "_id" : "85", "count" : 769, "code" : "8560Z", "label" : "Activités de soutien à l'enseignement" }
{ "_id" : "70", "count" : 592, "code" : "7022Z", "label" : "Conseil pour les affaires et autres conseils de gestion" }
{ "_id" : "96", "count" : 585, "code" : "9609Z", "label" : "Autres services personnels n.c.a." }
{ "_id" : "81", "count" : 582, "code" : "8130Z", "label" : "Services d'aménagement paysager" }

在Java方面,我已经尝试过此方法,但是在进行迭代的同时,下面的代码行引发了异常 org.bson.codecs.configuration.CodecConfigurationException:找不到类com.mongodb.client的编解码器。 model.BsonField。

private List<Document> cityActivityGraph() {

    Bson filter = Filters.eq("address.city", "LE MANS");
    BsonField id = new BsonField("_id", Filters.eq(new Document("$substrBytes", Arrays.asList("$ape.code", 0, 2))));
    BsonField count = Accumulators.sum("count", 1);
    BsonField label = Accumulators.last("ape.label", 1);
    BsonField code = Accumulators.last("ape.code", 1);

    Bson group = Aggregates.group(id, count, code, label);
    Bson match = Aggregates.match(filter);
    Bson projections = Projections.include("code", "label", "count");
    Bson project = Aggregates.project(projections);
    Bson sort = Sorts.descending("count");

    MongoCursor<Document> cursor = getTable().aggregate(Arrays.asList(
            Aggregates.match(match),
            Aggregates.group(group),
            Aggregates.project(project),
            Aggregates.sort(sort))).iterator(); <--- exception here

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

    while (cursor.hasNext()) {
        Document doc = cursor.next(); 
        System.out.println(doc.toJson());
        result.add(doc);
    }

    return result;

}

有什么主意吗?预先感谢

1 个答案:

答案 0 :(得分:0)

找到了一个解决方案,也许不是最有效的,但它可以工作

Bson id = new Document("_id", new Document("$substrBytes", Arrays.asList("$ape.code", 0, 3)));

BsonField code = Accumulators.last("code", "$ape.code");
BsonField label = Accumulators.last("label", "$ape.label");
BsonField count = Accumulators.sum("count", 1);
Bson projections = Projections.include("code", "label", "count");
Bson sort = Sorts.descending("count");

AggregateIterable<Document> stats = getTable().aggregate(Arrays.asList(

        Aggregates.match(filter),
        Aggregates.group(id, code, label, count),
        Aggregates.project(projections),
        Aggregates.limit(limit),
        Aggregates.sort(sort)

        ));

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

for (Document d:stats) {
    result.add(d);
}

return result;