虚位以待(AD)
虚位以待(AD)
首页 > 数据库 > MongoDB数据库 > MongoDB数据库学习-聚集-对用户的爱好进行聚集

MongoDB数据库学习-聚集-对用户的爱好进行聚集
类别:MongoDB数据库   作者:码皇   来源:<a href="http://blog.csdn.net/chunyuan314" target="_blank" rel="nofollow   点击:

MongoDB数据库学习-聚集-对用户的爱好进行聚集。

MongoDB数据库学习-聚集-对用户的爱好进行聚集。

对用户的爱好进行聚集

一个假想的运动俱乐部,它有个数据库,其中有个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}
相关热词搜索: