用户偏好数据汇总

在本页面

Data Model

考虑一个假设的体育俱乐部,它的数据库包含一个users集合,该集合跟踪用户的加入日期,运动偏好,并将这些数据存储在类似于以下内容的文档中:

{
  _id : "jane",
  joined : ISODate("2011-03-02"),
  likes : ["golf", "racquetball"]
}
{
  _id : "joe",
  joined : ISODate("2012-07-02"),
  likes : ["tennis", "golf", "swimming"]
}

对文档进行规范化和排序

以下操作以大写字母 Sequences 返回用户名。聚合包括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_joinedname

    • 从结果中抑制idaggregate()方法包括_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运算符会将此字段加 1.
  • $sort运算符根据month_joined字段的内容对$group创建的文档进行排序。

此聚合操作的结果类似于以下内容:

{
  "_id" : {
    "month_joined" : 1
  },
  "number" : 3
},
{
  "_id" : {
    "month_joined" : 2
  },
  "number" : 9
},
{
  "_id" : {
    "month_joined" : 3
  },
  "number" : 5
}

返回五个最常见的“喜欢”

以下汇总收集了数据集中前五个最“喜欢”的活动。这种类型的分析可以帮助规划和 Future 开发。

db.users.aggregate(
  [
    { $unwind : "$likes" },
    { $group : { _id : "$likes" , number : { $sum : 1 } } },
    { $sort : { number : -1 } },
    { $limit : 5 }
  ]
)

管道以users集合中的所有文档开始,并通过以下操作传递这些文档:

  • $unwind运算符分隔likes数组中的每个值,并为数组中的每个元素创建源文档的新版本。

Example

给定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,这是一个生成的字段。对于包含给定likes值的每个文档,$sum运算符会将此字段加 1.
  • $sort运算符按number字段的相反 Sequences 对这些文档进行排序。

  • $limit运算符仅包括前 5 个结果文档。

聚合的结果类似于以下内容:

{
  "_id" : "golf",
  "number" : 33
},
{
  "_id" : "racquetball",
  "number" : 31
},
{
  "_id" : "swimming",
  "number" : 24
},
{
  "_id" : "handball",
  "number" : 19
},
{
  "_id" : "tennis",
  "number" : 18
}