Есть ли способ вернуть совершенно другую структуру данных, используя агрегации и прогнозы mongodb?

#java #mongodb #spring-boot #spring-data-mongodb

#java #mongodb #весенняя загрузка #spring-data-mongodb

Вопрос:

Допустим, у меня есть следующая коллекция mongodb со следующей структурой:

 mongodocument:
   _id: xxx
    A: "CLEYMAR_COMPANY"
    category: Object
        ENGINEER: Object
        ARQUITECT: Object
 

Профессии могут быть нулевыми в зависимости от компании.

и я хочу вернуть структуру данных на основе следующего запроса:

Возвращает результирующий набор на основе категорий, учитывая список ключей для таких как

 ["CLEYMAR_COMPANY", "VIC_COMPANY"] 
 

и список категорий, таких как

 ["ENGINEER", "ARQUITECT"]
 

Результат:

 ENGINEER_RESULT :  [ENGINEER(corresponding to CLEYMAR COMPANY)      ENGINEER(corresponding to VIC_COMPANY)]

 ARQUITECT_RESULT: [ARQUITECT(corresponding to VIC COMPANY)]. 
    
    
 

Ответ №1:

Вам нужно автоматически подключить шаблон mongo.

 @Autowired
private MongoTemplate mongoTemplate;
 
  • $match чтобы соответствовать компаниям
  • $addFields перезаписать поле категории. Поскольку у нас есть динамический ключ в качестве категории в категории, мы преобразуем его в массив с использованием пар ключ-значение $objectToArray . Затем отфильтруйте массив с помощью списка профессий. Как только мы отфильтруем, он выдаст массив. Чтобы привести его к исходной форме, мы используем $arrayToObject

Поскольку spring data не предоставляет никаких $addFields данных, нам нужно использовать TRICK ДЛЯ ПРЕОБРАЗОВАНИЯ ЗАПРОСА ОБОЛОЧКИ MONGO В ЭКВИВАЛЕНТНЫЕ ОБЪЕКТЫ JAVA

И метод

 public List<Object> test(List<String> companies,List<String> professions ) {

    Aggregation aggregation = Aggregation.newAggregation(
        match(Criteria.where("A").in(companies)),
        a-> new Document("$addFields",
                new Document("category",
                        new Document("$arrayToObject",
                            new Document("$filter"
                                new Document()
                                .append("input",new Document("$objectToArray","$category"))                     
                                .append("cond",
                                    new Document("$in",Arrays.asList("$$this.k",professions))
                                )
                            )
                        )                                       
            )
        )

    ).withOptions(AggregationOptions.builder().allowDiskUse(Boolean.TRUE).build());

    return mongoTemplate.aggregate(aggregation, mongoTemplate.getCollectionName(YOUR_COLLECTION.class), Object.class).getMappedResults();

}
 

Рабочая игровая площадка Mongo

Примечание: код Java не тестируется. Он был написан на основе рабочего запроса mongo

Комментарии:

1. Привет, Варман, спасибо за ваш ответ. Первый вопрос: что делает новый документ?

2. Документация Java — представление документа в виде карты. Все итераторы будут проходить элементы в порядке вставки, как в LinkedHashMap .