#spring #mongotemplate
#весна #mongotemplate
Вопрос:
У меня есть коллекция сотрудников, которая выглядит так:
{
_id
company_id
job_type
name
age
created_at
...
}
У меня есть список company_ids
, и для каждого из них я хочу получить последние 3 сотрудника job_type="part_time"
и последние 3 для job_type="intern"
(в соответствии с created_at
полем)
Как я могу сделать это, используя один вызов? Ответ с mongoTemplate.bulkOps
также будет действительным.
Комментарии:
1. По каким критериям вы хотите отсортировать своих сотрудников, чтобы получить 3 последних?
2. @charlycou
created_at
только что обновлен, спасибо за вопрос3. Скажите мне, соответствует ли мое решение вашим потребностям. Вы можете заменить
_id
наcreated_at
, если дата создания документа не соответствуетcreated_at
полю.
Ответ №1:
Чтобы получить последнюю версию, вы можете использовать автоматически созданное поле _id, в которое встроена дата. Предполагая, что имя вашей коллекции — employee
вы можете использовать следующую агрегацию:
db.employee.aggregate([
{
$facet: {
"part_time": [
{
$match: {
"job_type": "part_time"
}
},
{
$match: {
"company_id": "id_from_your_list"
}
},
{ $sort: { "_id": 1 } },
{
$limit: 3
}
],
"intern": [
{
$match: {
"job_type": "intern"
}
},
{
$match: {
"company_id": "id_from_your_list"
}
},
{ $sort: { "_id": 1 } },
{
$limit: 3
}
]
}
}])
Я предполагаю, что вы используете spring data mongodb, вы можете выполнить эту операцию агрегирования с помощью MongoTemplate
помощника.
FacetOperation facetOperation = facet().and(match(Criteria.where("job_type").is("part_time")),match(Criteria.where("company_id").is("company_id_from_your_list")),
sort(Sort.Direction.ASC, "_id"),
limit(3)).as("part_time")
.and(match(Criteria.where("job_type").is("intern")),match(Criteria.where("company_id").is("company_id_from_your_list")),
sort(Sort.Direction.ASC, "_id"),
limit(3)).as("intern");
mongoTemplate.aggregate(Aggregation.newAggregation(facetOperation), "employee", Document.class).getUniqueMappedResult();