У меня есть следующий код, который получает связанный документ с заданным входом, входные данные являются 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, может кто-нибудь уточнить, пожалуйста,