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

在本页面

数据模型

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

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

规范化和排序文档

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

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

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

  • $project 操作:

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

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

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

  • operator 按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 operator:

    • 创建两个新字段:month_joinedname

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

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

  • $sort operator 按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 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创建的文档进行排序。

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

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

Return 五个 Common“喜欢”

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

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

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

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

[success] 例子

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

{
_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 operator 收集likes字段具有相同 value 的所有文档,并计算每个分组。有了这些信息,$group创建了一个包含两个字段的新文档:

    • _id,其中包含likes value。

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

  • $sort operator 按字段在 reverse order 中对这些文档进行排序。

  • $limit operator 仅包含前 5 个结果文档。

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

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

译者:李冠飞

校对:李冠飞

最后更新于