首页 > 解决方案 > 许多文档中的 mongodb 平均数组

问题描述

使用 mongodb,我有一个文档集合,其中每个文档都有一个固定长度的浮点值向量,如下所示:

    items = [
        {"id": "1", "vec": [1, 2, 0]},
        {"id": "2", "vec": [6, 4, 1]},
        {"id": "3", "vec": [3, 2, 2]},
    ]

我想对这些向量进行逐行平均。在这个例子中,我希望结果返回

[ (1 + 6 + 3) / 3, (2 + 4 + 2) / 3, (0 + 1 + 2) / 3 ]

这个答案非常接近我正在寻找的答案,但据我所知,它仅适用于大小为 2 的向量。mongoDB - 数组值的平均值

已经提供了一个对大型阵列来说性能不是很好的答案。对于上下文,我使用 ~700 维向量。

标签: mongodbaws-documentdb

解决方案


这应该有效:https ://mongoplayground.net/p/PKXqmmW31nW

[
  {
    $group: {
      _id: null,
      a: {
        $push: {
          $arrayElemAt: ["$vec", 0]
        }
      },
      b: {
        $push: {
          $arrayElemAt: ["$vec", 1]
        }
      },
      c: {
        $push: {
          $arrayElemAt: ["$vec", 2]
        }
      }
    }
  },
  {
    $project: {
      a: {
        $avg: "$a"
      },
      b: {
        $avg: "$b"
      },
      c: {
        $avg: "$c"
      }
    }
  }
]

哪个输出:

[
  {
    "_id": null,
    "a": 3.3333333333333335,
    "b": 2.6666666666666665,
    "c": 1
  }
]

这是一个没有 $avg 运算符的更有效的方法。我会留下其他答案以供参考。 https://mongoplayground.net/p/rVERc8YjKZv

db.collection.aggregate([
  {
    $group: {
      _id: null,
      a: {
        $sum: {
          $arrayElemAt: ["$vec", 0]
        }
      },
      b: {
        $sum: {
          $arrayElemAt: ["$vec", 1]
        }
      },
      c: {
        $sum: {
          $arrayElemAt: ["$vec", 2]
        }
      },
      totalDocuments: {
        $sum: 1
      }
    }
  },
  {
    $project: {
      a: {
        $divide: ["$a", "$totalDocuments"]
      },
      b: {
        $divide: ["$b", "$totalDocuments"]
      },
      c: {
        $divide: ["$c", "$totalDocuments"]
      }
    }
  }
])

推荐阅读