Структура агрегирования Mongodb для сортировки нескольких полей - PullRequest
0 голосов
/ 23 июня 2019

У меня есть следующий код, который получает связанный документ с заданным входом, входные данные являются categoryIds, personIds и типом, для категории он возвращает ожидаемый результат и сортирует их правильно, он получает все категории, соответствующие входу иотсортировал их по наиболее релевантным сверху, теперь я хочу добавить людей и также поместить наиболее релевантный результат в топ, но я не могу понять, как сгруппировать его по категориям.

Вот мой код длячто:

        Criteria exist = Criteria.where("personIds._id").exists(false);
    Criteria pe = Criteria.where("personIds._id").in(Arrays.asList("2411"));
    Criteria persons = new Criteria();
    persons.orOperator(pe, exist);

    Document cat = new Document("categoryIds._id",
            new Document("$in", Arrays.asList("7908", "7892", "7883", "7860")));

    Document type = new Document("type", "PROGRAM");

    Document categoryMatch = new Document("$match", cat);
    Document categoryUnwind = new Document("$unwind", "$categoryIds");
    Document match = new Document("$match", cat);

    Document personMatch = new Document("$match", persons.getCriteriaObject());

    AggregateIterable<Document> output = collection.aggregate(Arrays.asList(
            categoryMatch, categoryUnwind, match,
            personMatch,
            new Document("$match", type),
            new Document("$group", new Document("_id", "$" + "_id._id").append("count", new Document("$sum", 1))),
            new Document("$sort", new Document("count", -1))

    ));



    for (Document dbObject : output) {
        System.out.println("---> " + dbObject.toJson());
    }

результат этого кода:

Он находит все категории, имеющие заданные идентификаторы категорий, сортирует их в зависимости от того, сколько совпадений было найдено в одном документе.

вот вывод:

 { "_id" : "48999", "count" : 4 } --> this product match all the catgories
 { "_id" : "141523", "count" : 3 } --> this product has 3 matches
 { "_id" : "149366", "count" : 3 }
 { "_id" : "96084", "count" : 3 }

Теперь, когда категории равны, я хочу отсортировать по personIds, может кто-нибудь уточнить, пожалуйста,

...