用户偏好数据汇总

在本页面

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集合中的所有文档都通过管道,该管道包括以下操作:

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

{
  "name" : "JANE"
},
{
  "name" : "JILL"
},
{
  "name" : "JOE"
}

返回按加入月份排序的用户名

以下聚合操作返回按用户加入月份排序的用户名。这种聚合可以帮助生成成员资格更新通知。

db.users.aggregate(
  [
    { $project :
       {
         month_joined : { $month : "$joined" },
         name : "$_id",
         _id : 0
       }
    },
    { $sort : { month_joined : 1 } }
  ]
)

管道通过以下操作传递users集合中的所有文档:

该操作返回类似于以下内容的结果:

{
  "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集合中的所有文档:

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

{
  "_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集合中的所有文档开始,并通过以下操作传递这些文档:

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"
}

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

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