文档菜单
文档首页
/
MongoDB 手册
/ /

与用户偏好数据聚合

本页内容

  • 数据模型
  • 返回单个字段
  • 规范和排序文档
  • 按加入月份顺序返回用户名
  • 返回每月加入总数
  • 返回最常见的五个“点赞”

考虑一个包含以下内容的运动俱乐部数据库:members 集合跟踪成员的姓名、加入日期和运动偏好

db.members.insertMany( [
{
_id: "jane",
joined: ISODate("2011-03-02"),
likes: ["golf", "racquetball"]
},
{
_id: "joe",
joined: ISODate("2012-07-02"),
likes: ["tennis", "golf", "swimming"]
},
{
_id: "ruth",
joined: ISODate("2012-01-14"),
likes: ["golf", "racquetball"]
},
{
_id: "harold",
joined: ISODate("2012-01-21"),
likes: ["handball", "golf", "racquetball"]
},
{
_id: "kate",
joined: ISODate("2012-01-14"),
likes: ["swimming", "tennis"]
}
] )

以下操作使用$project 仅返回 _id 字段,用于 members 集合中的所有文档

db.members.aggregate(
[
{ $project: { _id: 1 } }
]
)

该操作返回以下文档

[
{ _id: 'jane' },
{ _id: 'joe' },
{ _id: 'ruth' },
{ _id: 'harold' },
{ _id: 'kate' }
]

对于基本的查询和投影操作,使用 find() 方法的标准查询具有最佳性能。

以下操作返回按字母顺序排列的成员名称。您可能会这样做来规范化成员名称以便处理。

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

所有来自 members 集合的文档都通过以下操作组成的管道

  • $project 操作符

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

    • 使用 $toUpper 操作符将 _id 的值转换为大写。然后 $project 创建一个新的字段,名为 name,以保存此值。

    • 抑制了 id 字段。默认情况下,$project 会传递 _id 字段,除非显式抑制。

  • $sort 操作符按 name 字段对结果进行排序。

该操作返回以下结果

[
{ name: 'HAROLD' },
{ name: 'JANE' },
{ name: 'JOE' },
{ name: 'KATE' },
{ name: 'RUTH' }
]

以下聚合操作返回按加入月份排序的成员名称。您可能可以使用此聚合操作来帮助生成会员续费通知。

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

管道将 members 集合中的所有文档通过以下操作

  • $project 操作符

    • 创建两个新字段:month_joinedname

    • 从结果中抑制了 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: 3, name: 'jane' },
{ month_joined: 7, name: 'joe' }
]

以下操作展示了每年每月有多少人加入。您可能可以使用这些聚合数据用于招聘和营销策略。

db.members.aggregate( [
{ $project: { month_joined: { $month: "$joined" } } } ,
{ $group: { _id: { month_joined: "$month_joined" } , number: { $sum: 1 } } },
{ $sort: { "_id.month_joined": 1 } }
] )

管道将 members 集合中的所有文档通过以下操作

  • $project 操作符创建一个新的名为 `month_joined` 的字段。

  • $month 操作符将 `joined` 字段的值转换为月份的整数表示。然后 `$project` 操作符将这些值分配给 `month_joined` 字段。

  • $group 操作符收集所有具有给定 `month_joined` 值的文档,并计算该值的文档数量。具体来说,对于每个唯一值,`$group` 创建一个新的 "每月" 文档,包含两个字段

    • _id,它包含一个嵌套文档,其中包含 `month_joined` 字段及其值。

    • number,这是一个生成的字段。`$sum` 操作符在包含给定 `month_joined` 值的每个文档中将此字段增加1。

  • $sort 操作符根据 `month_joined` 字段对由 `$group` 创建的文档进行排序。

聚合操作返回以下文档

[
{ _id: { month_joined: 1 }, number: 3 },
{ _id: { month_joined: 3 }, number: 1 },
{ _id: { month_joined: 7 }, number: 1 }
]

以下聚合操作收集数据集中“点赞”次数最多的前五个活动。此类分析有助于制定计划和未来发展。

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

管道从members集合中的所有文档开始,并通过以下操作处理这些文档

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

    示例

    以下来自members集合的文档

    {
    _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运算符按相反顺序对文档进行排序。

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

聚合操作返回以下文档

[
{ _id: 'golf', number: 4 },
{ _id: 'racquetball', number: 3 },
{ _id: 'tennis', number: 2 },
{ _id: 'swimming', number: 2 },
{ _id: 'handball', number: 1 }
]

返回

邮政编码示例