массовый поиск spring MongoTemplate

#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();