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