如何获得不同对象中两个值的平均值?

How to get average of two values which are in different objects?

提问人:AlwaysJunior 提问时间:3/3/2022 最后编辑:AlwaysJunior 更新时间:3/3/2022 访问量:93

问:

我的数据如下所示:

[
  {
    "_id": ObjectId("6213baa5a013b7c5f1232e23"),
    "birthDate": ISODate("1973-05-01T13:30:15Z"),
    "surname": "Johnson",
    "name": "Emma",
    "registerDate": ISODate("1900-06-11T17:30:15Z"),
    "children": [
      {
        "birthDate": ISODate("1993-05-21T16:30:15Z"),
        "surname": "Johnson",
        "name": "Liam"
      },
      {
        "birthDate": ISODate("1994-01-21T15:30:15Z"),
        "surname": "Johnson",
        "name": "Olivia",
        "registerDate": ISODate("2019-09-14T12:30:15Z")
      }
    ],
    "city": "Houston"
  }
]

我想计算有 registerDate 的人的注册年龄。在此示例中,我应该获得 Emma(父母)和 Olivia(孩子)的注册年龄平均值。我试过这个。 我计算了注册年龄并将它们添加为一个字段。我得到了奥利维亚的注册年龄。但是,我有 Emma 的重复注册年龄。我想使用其中之一。我怎样才能获得属于 Emma 和 Olivia 的注册年龄的平均数。我的意思是。您可以在添加的链接中看到这些值。(5+1)/2=3

MongoDB 聚合框架

评论


答:

0赞 Dharmaraj 3/3/2022 #1

你可以先用它来获取ages数组。然后使用$avg获得平均年龄。$map

$avg忽略非数值,包括缺失值。如果平均值的所有操作数都是非数值,则返回,因为零值的平均值为 。$avgnullundefined

[
  {
    "$addFields": {
      "ages": {
        "$map": {
          "input": "$children",
          "as": "child",
          "in": {
            $dateDiff: {
              startDate: "$$child.registerDate",
              endDate: "$$NOW",
              unit: "year"
            }
          }
        }
      }
    }
  },
  {
    "$addFields": {
      averageAge: {
        "$avg": {
          "$concatArrays": [
            "$ages",
            [
              {
                $dateDiff: {
                  startDate: "$registerDate",
                  endDate: "$$NOW",
                  unit: "year"
                }
              }
            ]
          ]
        }
      }
    }
  }
]

蒙戈游乐场

评论

0赞 AlwaysJunior 3/3/2022
缺少城市信息,有没有办法将城市添加到数据中?
0赞 Dharmaraj 3/3/2022
@JuniorDeveloper您能分享一下您正在运行的管道吗?我使用了addFields而不是project,因此不应该删除其他字段
0赞 AlwaysJunior 3/3/2022
mongoplayground.net/p/MzuK18jR4NP 这是我的管道。我将根据他们的城市计算所有有注册日期的人,即平均注册年龄。
0赞 Dharmaraj 3/3/2022
@JuniorDeveloper使用而不是像我的答案那样在第一阶段使用。$addFields$project