在整个集合中查找字符串字段中最常用的单词

use*_*745 4 string mapreduce mongodb aggregation-framework mongodb-aggregation

假设我有一个类似于以下内容的Mongo集合:

[
  { "foo": "bar baz boo" },
  { "foo": "bar baz" },
  { "foo": "boo baz" }
]
Run Code Online (Sandbox Code Playgroud)

是否有可能确定哪些单词最常出现在foo字段中(理想情况下是计数)?

例如,我喜欢以下结果:

[
  { "baz" : 3 },
  { "boo" : 2 },
  { "bar" : 2 }
]
Run Code Online (Sandbox Code Playgroud)

DAX*_*lic 5

最近关闭了一个关于在聚合框架阶段使用的运算符的JIRA问题. 有了它,您可以创建这样的管道 $split$project

db.yourColl.aggregate([
    {
        $project: {
            words: { $split: ["$foo", " "] }
        }
    },
    {
        $unwind: {
            path: "$words"
        }
    },
    {
        $group: {
            _id: "$words",
            count: { $sum: 1 }
        }
    }
])
Run Code Online (Sandbox Code Playgroud)

结果看起来像这样

/* 1 */
{
    "_id" : "baz",
    "count" : 3.0
}

/* 2 */
{
    "_id" : "boo",
    "count" : 2.0
}

/* 3 */
{
    "_id" : "bar",
    "count" : 2.0
}
Run Code Online (Sandbox Code Playgroud)