#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 } }
])