Подсчет слов в поле вложенной подсхемы коллекции MongoDB

#mongodb #aggregation-framework

#mongodb #фреймворк агрегации

Вопрос:

Я работаю над анализом данных CV из большой коллекции MongoDB. Я пытаюсь подсчитать абсолютную частоту слов в названии должности (поле jobs.JobTitle в схеме ниже).

Документы структурированы следующим образом:

 {
    firstName: String,
    lastName: String,
    jobs: [{jobTitle: 'software architect', company: String, ...}, {jobTitle: 'full stack software engineer', company: String, ...}, {jobTitle: 'javascript developer', company: String, ...}],
    ...
}
  

Я хотел бы выполнить итерацию по всей коллекции и получить такой результат:

 [{word: 'manager', count: 3245},{word: 'engineer', count: 3102}, {word: 'software', count: 3021}, ..]
  

Я попробовал следующую агрегацию:

 db.cvs.aggregate([
    {
        $project: {
            words: { $split: ["$jobs.jobTitle", " "] }
        }
    },
    {
        $unwind: {
            path: "$words"
        }
    },
    {
        $group: {
            _id: "$words",
            count: { $sum: 1 }
        }
    }, 
    { $sort: { "count": -1 } }
]) 
  

Что приводит к следующему сообщению об ошибке:

 $split requires an expression that evaluates to a string as a first argument, found: array
  

Могу ли я сначала объединить строковые значения jobs.JobTitle в строку с помощью агрегации? Или есть какой-либо другой способ достичь ожидаемого результата?

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

1. { "$unwind": "$jobs" } как и на первом этапе до $project . Это «Массив», поэтому вам нужно «сгладить» его, прежде чем вы сможете просто получить доступ к отдельным строкам.

2. @NeilLunn большое спасибо. Это напрямую решило проблему.

Ответ №1:

Спасибо за быстрый комментарий @NeilLunn

Я хотел бы поделиться исправленным запросом со всеми:

 db.cvs.aggregate([
    { "$unwind": "$jobs" },
    {
        $project: {
            words: { $split: ["$jobs.jobTitle", " "] }
        }
    },
    {
        $unwind: {
            path: "$words"
        }
    },
    {
        $group: {
            _id: "$words",
            count: { $sum: 1 }
        }
    }, 
    { $sort: { "count": -1 } }
])