这篇文章非常古老,但是我们需要编写自己的立方根实现来替换$pow(x,1/3)
。原因是我们正在使用AWS DocumentDB来避免托管和管理自己的MongoDB数据库。然而,AWS Document DB 不支持任何版本的$sqrt
或$pow
操作符。我也无法弄清楚为什么他们不支持它。
我们实现了两个版本,使用牛顿法和哈雷方法(因为后者收敛更快)。从技术上讲,它们也基于@chridram使用聚合框架的答案。您可以复制确切的命令以重现它:
启动一个Docker容器并执行mongosh
:
docker run -d -p 27017:27017 --name test-mongo mongo:latest
docker exec -it test-mongo mongosh
牛顿法:
use test
db.roots.insert({n:29})
firstguess = { $project : { n : 1, r : { $literal : 1}}}
refine = { $project : { n: 1, r : { $multiply: [{$divide: [1, 3]},{$add:[{$divide: ["$n", {$multiply: ["$r","$r"]}]},{$multiply:[2, "$r"]}]}]
}}}
db.roots.aggregate([firstguess,refine,refine,refine,refine,refine,refine,refine,refine])
海莉方法:
use test
db.roots.insert({n:29})
firstguess = { $project : { n : 1, r : { $literal : 1}}}
refine = { $project : { n: 1, r :
{
$multiply: [
"$r",
{
$divide: [
{
$add: [
{$multiply: ["$r", "$r", "$r"]},
{$multiply: [2, "$n"]}
]
},
{
$add: [
{$multiply: [2, "$r", "$r", "$r"]},
"$n"
]
}
]
}
]
}}}
db.roots.aggregate([firstguess,refine,refine,refine,refine,refine,refine,refine,refine])
有关实际公式的更多详细信息,请参见https://en.wikipedia.org/wiki/Cube_root。
进一步的改进可以使用$addFields
而不是$project
。 这样更容易阅读。 请参见https://www.mongodb.com/docs/manual/reference/operator/aggregation/addFields/
链接
提供了一个解决方法。 - Anand Jayabalan