当前位置: 首页 > 知识库问答 >
问题:

在MongoDB的聚合管道中获取$group之后输入文档中的字段

孙文康
2023-03-14

我面临的问题是如何在一次组操作后访问原始文档,并在MongoDB的聚合流水线中携带$group后的字段。

原始文件是:

{
"_id" : ObjectId("361de42f1938e89b179dda42"),
"user_id" : ObjectId("9424021bafbde55512e39b83"),
"candidate_id" : ObjectId("54f65356294160421ead3ca1")
"OVERALL_SCORE" : 150,
"SCORES" : [ 
    { "NAME" : "asd", "OBTAINED_SCORE" : 28}, { "NAME" : "acd", "OBTAINED_SCORE" : 36 }, { "NAME" : "abc", "OBTAINED_SCORE" : 40}
 ]
}

聚合功能:

 db.coll.aggregate([ $group : { _id : { user_id : "$user_id"}, BEST_SCORE : { $max : "$OVERALL_SCORE"}, AVG_SCORE : { $avg : "$OVERALL_SCORE" }}} ])

下面是示例输出(第1组之后):

{
"result" : [ 
    {
        "_id" : {
            "user_id" : ObjectId("9424021bafbde55512e39b83")
        },
        "BEST_SCORE" : 150,
        "AVG_SCORE" : 132
    }
],
"ok" : 1
 }
   db.coll.aggregate([ $group : { _id : { user_id : "$user_id"}, BEST_SCORE : { $max : "$OVERALL_SCORE"}, AVG_SCORE : { $avg : "$OVERALL_SCORE" }}}, { $unwind : "$SCORES"}, /*problem is--after group operation "SCORES" field which is in original document not available */ { $group : _id : { NAME: "$SCORES.NAME"}, AVG_OBTAINED_SCORE: { $avg : "$SCORES.OBTAINED_SCORE"}} **/*problem is--this is also in the original document*/** ])
   "BEST_SCORE": 150,                     //after 1st group
  "AVG_SCORE": 132,                       //after 1st group
  "SCORES": [                             //problem --- unwind "SCORES" and then group which is actually will not be available after 1st group (get this from original document)
    {
      "NAME": "abc",
      "AVG_OBTAINED_SCORE": 25.5
    },
    {
      "NAME": "asd",
      "AVG_OBTAINED_SCORE": 24
    },
    {
      "NAME": "acd",
      "AVG_OBTAINED_SCORE": 32
    }
  ]

谢谢。

共有1个答案

郁灿
2023-03-14

当使用要保留组中所有考虑的文档的值的内容进行分组时,需要使用$push。关键在于,这是一个数组。因此,您处理$unwind两次,并且还有两个$group阶段:

db.coll.aggregate([
    {  "$group" : { 
        "_id": "$user_id", 
        "BEST_SCORE": { "$max": "$OVERALL_SCORE" },
        "AVG_SCORE": { "$avg": "$OVERALL_SCORE" },
        "SCORES": { "$push": "SCORES" }
    }}, 

    // SCORES in an array of arrays. Unwind twice
    { "$unwind": "$SCORES" },
    { "$unwind": "$SCORES" },

    // Group for averages on elements
    { "$group": {
        "_id": {
            "user_id": "$_id",
            "NAME": "$SCORES.name"
        },
        "BEST_SCORE": { "$first": "$BEST_SCORE" },
        "AVG_SCORE": { "$first": "$AVG_SCORE" }
        "AVG_OBTAINED_SCORE": { "$avg": "$SCORES.OBTAINED_SCORE" } 
    }},

    // Group to user_id
    { "$group": {
        "user_id": "$_id.user_id",
        "BEST_SCORE": { "$first": "$BEST_SCORE" },
        "AVG_SCORE": { "$first": "$AVG_SCORE" }
        "SCORES": { "$push": {
            "NAME": "$_id.NAME",
            "AVG_OBTAINED_SCORE": "$AVG_OBTAINED_SCORE"
        }}     
    }}
])

您可能会考虑在第一个$group之前使用$unwind,但是如果这样做了,那么计算的平均值将受到数组中被“取消缠绕”的元素数量的影响。因此,“双美元释放”是一个必要的过程。

 类似资料:
  • 我想从引用的文档中获取字段值。Mongodb版本是3.4。 假设我有两个收藏foo和bar。Foo提到bar: 相应的条形码文档看起来像这样: 我尝试了以下聚合函数来归档此结果: 聚合功能: 但我的结果是这样的: 我试着用谷歌搜索它,我查看了mongodb文档,但没有找到解决方案。 是我错过了什么还是这不可能? 谢谢

  • 我在尝试使用MongooseJs在Mongodb中按嵌套数组排序时遇到了一个小问题。 a)一个产品包含任务,每个任务都有子任务。 b)任务有顺序 这是一个示例产品文档: 结果: } 我正在使用MongoDB聚合管道来订购任务 结果: } 预期结果: 我真的很接近了,所有的排序似乎都在工作。我只需要一些帮助来将子任务放回父母体内。非常感谢任何帮助。 谢谢

  • 我试图使用MongoDb列出展开嵌套数组。 一个产品包含任务,每个任务可以有零个、一个或多个子任务。 以下是产品文档示例: 结果: 聚合管道在对任务进行排序方面起到了很大的作用 有时任务没有子任务,例如: 当他们没有孩子的时候,还有什么可以帮助他们完成任务吗? 当前聚合: 期望的结果:

  • 给定具有以下文档结构的MongoDB集合: 其中每个文档包含一个子文档数组,我希望将集合转换为以下结构的文档: 其中每个子文档现在是主文档中以子文档中的一个值命名的新字段的值(在该示例中,< code>animal字段的值用于创建新字段的名称,即< code>cat和< code>dog)。 我知道如何使用爪哇脚本片段进行。它很慢。我的问题是:如何使用聚合管道完成此操作?

  • 本文向大家介绍如何获取 MongoDB 聚合中的子字符串,包括了如何获取 MongoDB 聚合中的子字符串的使用技巧和注意事项,需要的朋友参考一下 要获取子字符串,请在MongoDB中使用$substr。让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是在MongoDB聚合中获取子字符串的查询- 这将产生以下输出-

  • 在MongoDB聚合管道中,从一个阶段到另一个阶段的记录流一次发生一个/批(或者)将等待当前阶段完成整个收集,然后再将其传递到下一个阶段? 例如,我有一个包含以下示例记录的集合类测试 我总共有大约100名学生的1000条记录,我有以下汇总查询 我有以下问题。 排序顺序在最终结果中丢失。如果我在$group之后放置另一个排序,则结果会正确排序。这是否意味着$group不维护之前的排序顺序? 我想将结

  • 如果文档集合包含: 我想构建一个聚合,通过我的myDocRefId字段只返回没有被任何其他文档引用的文档。对于这个集合,我想返回: 文档1在聚合中被删除,因为文档3具有对它的引用。 如何在聚合管道中实现这一点?

  • 本文向大家介绍MongoDB教程之聚合(count、distinct和group),包括了MongoDB教程之聚合(count、distinct和group)的使用技巧和注意事项,需要的朋友参考一下 1. count:      2. distinct:     distinct用来找出给定键的所有不同的值。使用时也必须指定集合和键。   3. group:     group做的聚合有些复杂。先