- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
有没有办法在 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
,这是一个很接近的猜测,但你可以做得更好。
此方法中使用的方程是牛顿平方根方程:
在哪里
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/
我有一个 Cassandra 集群,里面有 4 个表和数据。 我想使用聚合函数(sum,max ...)发出请求,但我在这里读到这是不可能的: http://www.datastax.com/docu
我有以下两张表 Table: items ID | TITLE 249 | One 250 | Two 251 | Three 我投票给这些: Table: votes VID | IID | u
这个问题在这里已经有了答案: Update MongoDB field using value of another field (12 个答案) 关闭 3 年前。 我想根据另一个“源”集合的文档中
我的收藏包含以下文件。我想使用聚合来计算里面有多少客户,但我遇到了一些问题。我可以获得总行数,但不能获得总(唯一)客户。 [{ _id: "n001", channel: "Kalip
我有下表 Id Letter 1001 A 1001 H 1001 H 1001 H 1001 B 1001 H 1001 H 1001
得到一列的表 ABC。 “创建”的日期列。所以样本值就像; created 2009-06-18 13:56:00 2009-06-18 12:56:00 2009-06-17 14:02:0
我有一个带有数组字段的集合: {[ name:String buyPrice:Int sellPrice:Int ]} 我试图找到最低和最高买入/卖出价格。在某些条目中,买入或卖出价格为零
我有以下问题: 在我的 mongo db 中,我有以下结构: { "instanceId": "12", "eventId": "0-1b", "activityType":
下面给出的是我要在其上触发聚合查询的 Elasticsearch 文档。 { "id": 1, "attributes": [ { "fieldId": 1,
我正在使用 Django 的 aggregate query expression总计一些值。最终值是一个除法表达式,有时可能以零作为分母。如果是这种情况,我需要一种方法来逃避,以便它只返回 0。 我
我正在学习核心数据,特别是聚合。 当前我想要做的事情:计算表中在某些条件上具有逆关系的多对关系的记录数。 目前我正在这样做: NSExpression *ex = [NSExpression expr
我需要有关 Delphi 中的 ClientDatasets 的一些帮助。 我想要实现的是一个显示客户的网格,其中一列显示每个客户的订单数量。我将 ClientDataset 放在表单上并从 Delp
我的集合有 10M 个文档,并且有一个名为 movieId 的字段;该文档具有以下结构: { "_id" : ObjectId("589bed43e3d78e89bfd9b779"), "us
这个问题已经有答案了: What is the difference between association, aggregation and composition? (21 个回答) 已关闭 9
我在 elasticsearch 中有一些类似于这些示例的文档: { "id": ">", "list": [ "a", "b", "c" ] } { "id"
我正在做一些聚合。但是结果完全不是我所期望的,似乎它们没有聚合索引中与我的查询匹配的所有文档,在这种情况下 - 它有什么好处? 例如,首先我做这个查询: {"index":"datalayer","t
假设我在 ES 中有这些数据。 | KEY | value | |:-----------|------------:| | A |
可能在我的文档中,我有一个被分析的文本字段。我只是在ElasticSearch AggregationAPI中迷路了。我需要2种不同情况的支持: 情况A)结果是带有计数标记(条款)的篮子下降。 情况B
我正在为网上商店构建多面过滤功能,如下所示: Filter on Brand: [ ] LG (10) [ ] Apple (5) [ ] HTC (3) Filter on OS: [ ] Andr
我有一个父/子关系并且正在搜索 child 。 是否可以在父属性上创建聚合? 例如parent 是 POST,children 是 COMMENT。如果父项具有“类别”属性,是否可以搜索 COMMEN
我是一名优秀的程序员,十分优秀!