【问题标题】:mongodb: aggregates over a list contained in each documentmongodb:聚合每个文档中包含的列表
【发布时间】:2017-06-26 16:19:43
【问题描述】:

我目前正在阅读the mongoDb aggregation introduction。这些示例展示了聚合操作的强大功能,例如,对集合中文档子集的某些值求和。

我需要的实际上有点不同:我需要在集合的每个文档中包含的列表中执行相同的操作。通过这种方式,我仍然可以获得集合中包含的每个文档的元素,但是每个文档中包含的列表将被折叠,通过对列表中包含的子文档中包含的某个字段进行求和。

这可以通过 MongoDB 中的正常管道/聚合操作实现吗?

【问题讨论】:

    标签: mongodb aggregation-framework nosql


    【解决方案1】:

    我发现$unwind 运算符允许将文档中包含的列表扩展到多个文档。

    例如,以下查询只是将sessions 列表扩展为多个文档,之后可以使用这些文档对Ts 字段进行聚合:

    db.userStats.aggregate([
        { $match: {"u":{ "$in": [1,2,3,4,5] }}},
        { $unwind: "$sessions" },
        { $group: { _id:"$u" , total: { $sum: "$sessions.Ts"}}},
    ])
    

    【讨论】:

    • 这能解决您的问题吗?如果是这样,您应该将您的答案标记为已接受。将$unwind$group$sum 一起使用可以让您对文档中数组中的元素求和。
    • 当然,但我必须等待 2 天才能接受我自己的答案
    【解决方案2】:

    听起来您想做一个 $project,如果您希望将所有结果合并到一个文档中,则可能后跟一个 $group。比如:

    db.userStats.aggregate([
        { $match: {"u":{ "$in": [1,2,3,4,5] }}},
        { $project: { total: { $sum: "$sessions.Ts"}}},
        { $group: { _id:"$u" , total: { $first: "$total" }}},
    ])
    

    【讨论】:

    • $sum 是一个累加器,仅在聚合管道的 group 阶段可用。
    • 哦,这解释了你为什么要使用 $unwind,那么。我想知道他们将如何响应功能请求以支持 $project 中的累加器...
    猜你喜欢
    • 2015-04-01
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    相关资源
    最近更新 更多