用户偏好数据的示例


进入MongoDB中文手册(4.2版本)目录

1 数据模型

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

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

2 文档的规范化和排序

以下操作以大写字母顺序返回用户名。聚合包括users集合中所有文档的用户名。您可以执行此操作来在规范用户名的基础上进行处理。

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

users集合中的所有文档都通过管道,该管道包括以下操作:

  • $project运算符
    • 创建一个名为name的新字段。
    • 使用$toUpper运算符将_id的值转换为大写 。然后,$project创建一个新字段,命名为name来保存该值。
  • $sort运算符根据name字段对结果排序

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

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

3 返回按加入月份排序的文档

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

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字段。
  • $sor运算符通过month_joined字段对结果排序 。

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

{
  "month_joined" : 1,
  "name" : "ruth"
},
{
  "month_joined" : 1,
  "name" : "harold"
},
{
  "month_joined" : 1,
  "name" : "kate"
}
{
  "month_joined" : 2,
  "name" : "jill"
}

4 返回每月的加入总数

以下操作显示一年中每个月有多少人加入。您可以将这些汇总数据用于招聘和营销策略。

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使用两个字段创建一个新的“每月(per-month)”文档:
    • _id,其中包含带有该month_joined字段及其值的嵌套文档
    • number,这是一个生成的字段。$sum运输符对于每个包含给定month_joined值的文档,对该字段增加1 。
  • $sort运算符对这些文档排序,这些文档由$group根据month_joined字段的内容创建的。

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

{
  "_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值的文档,对该字段增加1 。
  • $sort运算符通过number字段对这些文档以降序的方式排序。

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

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


进入MongoDB中文手册(4.2版本)目录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值