MongoDB文档翻译-聚集-对用户的爱好进行聚集

英文原文地址: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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值