gpt4 book ai didi

mongodb - MongoDB聚合管道中的平方根

转载 作者:IT老高 更新时间:2023-10-28 13:23:24 25 4
gpt4 key购买 nike

有没有办法在 MongoDB 聚合管道中获取字段的平方根?我在想这样的事情:

db.collection.aggregate(
{ $group: _id: null, sum: { $sum: "$values" }},
{ $project: { answer: { $sqrt: "$sum" }}})

我知道 $sqrt 不存在,也不存在任何电力运营商,但有没有办法在聚合管道中实现这一点?我知道这可以通过 map-reduce 中的用户定义函数来完成,但是在聚合管道中可以吗?

最佳答案

正如@AnandJayabalan 指出的那样, $sqrt 运算符将随 MongoDB 3.2 版一起发布,语法如下:

{ $sqrt: <number> }

在你的例子中,这将是

db.collection.aggregate([
{ $group: { _id: null, total: { $sum: "$values" }}},
{ $project: { answer: { $sqrt: "$total" }}}])

在撰写本文时,作为解决方法,John Page 链接的博客文章中关于 calculating square roots within the aggregation framework使用算术原语计算平方根 Newton's method .

只是为了解释这个算法是如何工作的,假设你想找到一个正数 N 的平方根。牛顿的方法包括对数字 A 进行有根据的猜测,当平方后,将接近等于 N

例如,如果 N = 121,您可能会猜测 A = 10,因为 A² = 100,这是一个很接近的猜测,但你可以做得更好。

此方法中使用的方程是牛顿平方根方程:

enter image description here

在哪里

  • N 是你要求平方根的正数
  • 是平方根号
  • 意思是“大约等于……”
  • A 是您有根据的猜测

如有必要,牛顿法允许您多次重复估算以接近准确数字。以 John Page 的示例 N = 29 为例,您猜测 A = 5,您可以将值输入等式和算法步骤

a.从猜测开始A = 5

b.将N除以猜测(29/5 = 5.9)

c. 将其添加到猜测中 (5.9 + 5 = 10.9)

d. 然后将该结果除以 2 (10.9/2 = 5.45)

e. 将其设置为新的猜测 A = 5.45,然后重复,从 b.

开始

5.45 5.38555 5.38516

经过 2 次迭代,答案是 3.1623,接近平方根的精确值。

现在,使用聚合框架(来自 John Page 的博客文章)并将其应用于您的示例,聚合管道将是:

var groupPipeline = { $group: _id: null, total: { $sum: "$values" } },
firstGuess = {
$project : {
n : "$total", r : { $literal : 5 } /* similar to step a) in the algorithm, the $literal operator sets r to the value 5 */
}
},
refineStep = {
$project : {
n: 1, r : {
$divide : [ /* step d) of the algorithm */
{
$add : [ /* step c) of the algorithm */
{ $divide : [ "$n", "$r"] }, /* step b) of the algorithm */
"$r"
]
},
2
]
}
}
};

/* Run the aggregation pipeline */
> db.collection.aggregate(groupPipeline, firstGuess, refineStep, refineStep, refineStep)

> { "_id" : ObjectId("538062103439ddd3764ff791"), "n" : 29, "r" : 5.385164807134505 }

关于mongodb - MongoDB聚合管道中的平方根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25393817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com