使用用户首选项数据进行聚合

    在本页面

    数据模型

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

    1. {
    2. _id : jane“,
    3. joined : ISODate(“2011-03-02“),
    4. likes : [“golf“, racquetball“]
    5. }
    6. {
    7. _id : joe“,
    8. joined : ISODate(“2012-07-02“),
    9. likes : [“tennis“, golf“, swimming“]
    10. }

    规范化和排序文档

    以下操作以大写和字母 order 返回用户名。聚合包括users集合中所有文档的用户名。您可以这样做以规范化用户名以进行处理。

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

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

    • $project 操作:

      • 创建一个名为name的新字段。

      • 使用$toUpper operator 将_id的 value 转换为大写。然后$project创建一个名为name的新字段来保存此 value。

      • 抑制id字段。除非明确禁止,否则$project将默认通过_id字段。

    • operator 按name字段对结果进行排序。

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

    1. {
    2. "name" : "JANE"
    3. },
    4. {
    5. "name" : "JILL"
    6. },
    7. {
    8. "name" : "JOE"
    9. }

    返回按月加入订单的用户名

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

    1. db.users.aggregate([
    2. { $project :
    3. {
    4. month_joined : { $month : $joined },
    5. name : $_id“,
    6. _id : 0
    7. }
    8. },
    9. { $sort : { month_joined : 1 } }
    10. ])

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

    • $project operator:

      • 创建两个新字段:month_joinedname

      • 从结果中抑制id。除非明确禁止,否则aggregate()方法包含_id

    • $month operator 将joined字段的值转换为月份的 integer 表示。然后$project operator 将这些值分配给month_joined字段。

    • $sort operator 按month_joined字段对结果进行排序。

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

    1. {
    2. month_joined : 1,
    3. name : ruth
    4. },
    5. {
    6. month_joined : 1,
    7. name : harold
    8. },
    9. {
    10. month_joined : 1,
    11. name : kate
    12. },
    13. {
    14. month_joined : 2,
    15. name : jill
    16. }

    返回每月的联接总数

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

    1. db.users.aggregate([
    2. { $project : { month_joined : { $month : $joined } } } ,
    3. { $group : { _id : {month_joined:“$month_joined“} , number : { $sum : 1 } } },
    4. { $sort : { _id.month_joined : 1 } }
    5. ])

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

    • $project operator 创建一个名为month_joined的新字段。

    • $month operator 将joined字段的值转换为月份的 integer 表示。然后$project operator 将值分配给month_joined字段。

    • $group operator 收集具有给定month_joined value 的所有文档,并计算该 value 的文档数量。具体来说,对于每个唯一 value,$group创建一个包含两个字段的新“per-month”文档:

      • _id,包含带有month_joined字段及其 value 的嵌套文档。

      • number,这是一个生成的字段。对于包含给定month_joined value 的每个文档,$sum operator 将此字段递增 1。

    • $sort operator 根据month_joined字段的内容对$group创建的文档进行排序。

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

    1. {
    2. _id : {
    3. month_joined : 1
    4. },
    5. number : 3
    6. },
    7. {
    8. _id : {
    9. month_joined : 2
    10. },
    11. number : 9
    12. },
    13. {
    14. _id : {
    15. month_joined : 3
    16. },
    17. number : 5
    18. }

    Return 五个 Common“喜欢”

    以下聚合收集数据集中前五个最“喜欢”的活动。这种分析有助于规划和未来发展。

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

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

    • $unwind operator 分隔likes array 中的每个 value,并为 array 中的每个元素创建源文档的新 version。

    [success] 例子

    给出来自用户集合的以下文档:

    1. {
    2. _id : "jane",
    3. joined : ISODate("2011-03-02"),
    4. likes : ["golf", "racquetball"]
    5. }

    $unwind运算符将创建下列文件:

    1. {
    2. _id : jane“,
    3. joined : ISODate(“2011-03-02“),
    4. likes : golf
    5. }
    6. {
    7. _id : jane“,
    8. joined : ISODate(“2011-03-02“),
    9. likes : racquetball
    10. }
    • $group operator 收集likes字段具有相同 value 的所有文档,并计算每个分组。有了这些信息,$group创建了一个包含两个字段的新文档:

      • _id,其中包含likes value。
      • number,这是一个生成的字段。对于包含给定likes value 的每个文档,$sum operator 将此字段递增 1。
    • $sort operator 按字段在 reverse order 中对这些文档进行排序。
    • $limit operator 仅包含前 5 个结果文档。

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

    1. {
    2. _id : golf“,
    3. number : 33
    4. },
    5. {
    6. _id : racquetball“,
    7. number : 31
    8. },
    9. {
    10. _id : swimming“,
    11. number : 24
    12. },
    13. {
    14. _id : handball“,
    15. number : 19
    16. },
    17. {
    18. _id : tennis“,
    19. number : 18
    20. }

    译者:李冠飞

    校对:李冠飞

    参见

    原文 - Example with User Preference Data