英文原文地址:https://docs.mongodb.com/v3.2/text-search/。
本文章属个人翻译,作个人学习之用,如有雷同,纯属巧合。如有错误之处,欢迎指正。
对用户的爱好进行聚集
一个假想的运动俱乐部,它有个数据库,其中有个users
集合,用来跟踪用户的加入日期、运动爱好,按如下格式保存在文档中:
{
_id : "jane",
joined : ISODate("2011-03-02"),
likes : ["golf", "racquetball"]
}
{
_id : "joe",
joined : ISODate("2012-07-02"),
likes : ["tennis", "golf", "swimming"]
}
标准化文档和排序
下面的操作按字母顺序返回大写的用户名。该聚集操作包含users集合中所有文档中的用户名。你可能需要这样做来标准化用户名,以作处理:
db.users.aggregate(
[
{ $project : { name:{$toUpper:"$_id"} , _id:0 } },
{ $sort : { name : 1 } }
]
)
users文档中的所有集合通过由以下操作组成的文档:
$project
操作符:创建一个叫做name的新字段
用
$toUpper
操作符把_id字段的值转变成大写
然后
$project
创建一个叫做name的新字段来保存它的值。- 不输出_id字段。
$project
默认会传输_id字段,除非显式抑制。
$sort
操作符按name字段对结果进行排序。
聚集结果类似下面的形式:
{
"name" : "JANE"
},
{
"name" : "JILL"
},
{
"name" : "JOE"
}
按加入的月份排序返回用户名
下面的聚集操作按用户加入的月份返回用户名。这种聚集操作可以用来帮助生成会员续费通知。
db.users.aggregate(
[
{ $project :
{
month_joined : { $month : "$joined" },
name : "$_id",
_id : 0
}
},
{ $sort : { month_joined : 1 } }
]
)
该管道把users文档中的所有文档通过以下操作:
$project
操作符:
- 创建了两个新字段:month_joined和name。
- 从结果中抑制_id字段输出。
aggregate()
方法会包含_id字段,除非显式抑制。
$month
操作符把joined字段的值转换成整数表示的月份。$project
操作符把这些值赋值给month_joined字段。$sort
操作符按month_joined字段对结果排序。
该操作返回类似下面的结果:
{
"month_joined" : 1,
"name" : "ruth"
},
{
"month_joined" : 1,
"name" : "harold"
},
{
"month_joined" : 1,
"name" : "kate"
}
{
"month_joined" : 2,
"name" : "jill"
}
返回每个月的加入总人数
以下操作显示每月有多少人加入。你可以把这个聚集用于招募和营销策略上。
db.users.aggregate(
[
{ $project : { month_joined : { $month : "$joined" } } } ,
{ $group : { _id : {month_joined:"$month_joined"} , number : { $sum : 1 } } },
{ $sort : { "_id.month_joined" : 1 } }
]
)
该管道把users集合中的所有文档通过如下操作:
$project
操作符创建了一个叫做month_joined的字段。$month
操作符把joined字段的值转换成整数表示的月份。然后,$project
操作符把值赋给month_joined字段。$group
操作符把有month_joined字段值的文档收集在一起,并统计那个值有多少个文档。特别地,对于每个唯一的值,$group
创建了一个新的“每月”文档,这个文档有两个字段:
- _id字段,包含一个有month_joined字段的嵌套文档
- number字段,这是一个生成的字段。对于每个包含给定month_joined值的文档,
$sum
操作符会把这个字段的值加一.
$sort
操作符根据month_joined字段的内容对$group
产生的文档进行排序。
该聚集操作的结果类似下面的形式:
{
"_id" : {
"month_joined" : 1
},
"number" : 3
},
{
"_id" : {
"month_joined" : 2
},
"number" : 9
},
{
"_id" : {
"month_joined" : 3
},
"number" : 5
}
返回前五个最常见的“爱好”
下面的聚集收集数据集中前5个最受欢迎的活动。该分析可有助于安排计划和未来发展。
db.users.aggregate(
[
{ $unwind : "$likes" },
{ $group : { _id : "$likes" , number : { $sum : 1 } } },
{ $sort : { number : -1 } },
{ $limit : 5 }
]
)
该聚集以users集合中的所以后文档开始,把它们通过以下操作:
$unwind
操作符把likes数组中的每个值分开,对数组中的每个元素创建一个新版本的文档。例如:
给定下面来自users集合的文档:
{ _id : "jane", joined : ISODate("2011-03-02"), likes : ["golf", "racquetball"] }
$unwind操作符将会创建下面的文档:
{ _id : "jane", joined : ISODate("2011-03-02"), likes : "golf" } { _id : "jane", joined : ISODate("2011-03-02"), likes : "racquetball" }
$group
操作符把有相同likes字段值的文档收集起来,对每个分组统计。$group
创建了有两个字段的新文档:- _id,包含likes的值
- number,是一个生成的字段。
$sum
操作符对每个包含给定likes值的文档,会对number字段加一。
$sort
操作符按number字段的降序对文档排序。$limit
操作符只包含结果中的前5个文档。
聚集结果类似下面的形式:
{
"_id" : "golf",
"number" : 33
},
{
"_id" : "racquetball",
"number" : 31
},
{
"_id" : "swimming",
"number" : 24
},
{
"_id" : "handball",
"number" : 19
},
{
"_id" : "tennis",
"number" : 18
}