Оболочка mongodb для составного оператора java-драйвера - PullRequest
0 голосов
/ 26 августа 2018

Я могу запустить агрегатный запрос MongoDb (3.8) в оболочке mongo, но не могу получить его с помощью драйвера java (3.4 java 8).

вот структура входного источника,Я хочу собирать информацию для предоставления статистики деятельности компании.обратите внимание, что в документе ape указано зарегистрированное предприятие.Я хочу сгруппировать по первым 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
    }
}

Выполнение этой команды в оболочке работает как шарм

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 голосов
/ 27 августа 2018

нашел решение, возможно, не самое эффективное, но оно работает

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;
...