在这样的集合中:
db.consFieldTest.insert([
{ status : "err" }
{ status : "suc" }
{ status : "res" }
{ status : "res" }
{ status : "err" }
{ status : "err" }
{ status : "err" }
]);
聚合结果应该是这样的:
{ status: "err", maxCons : 3 },
// (optional) { status: "suc", maxCons : 1 },
// (optional) { status: "res", maxCons : 2 }
实际上如果maxCons 计数器停在 3 就可以了,我需要知道 err 状态是否连续出现 3 次或更多。
解决思路:
我想到了一种解决方法,在所有文档上添加增量,如下所示:
{ status : "err", id : 0 },
{ status : "suc", id : 1 },
{ status : "res", id : 2 },
{ status : "res", id : 3 },
{ status : "err", id : 4 },
{ status : "err", id : 5 },
{ status : "err", id : 6 }
然后将它们分组到 0-2、1-3、2-4 等范围内,... 这将导致:
{ _id : 0
res : [
{ status : "err", id : 0 },
{ status : "suc", id : 1 },
{ status : "res", id : 2 }
]
},
{ _id : 1
res : [
{ status : "suc", id : 1 },
{ status : "res", id : 2 },
{ status : "res", id : 3 },
]
},
{
_id : 2
res : [
{ status : "res", id : 2 },
{ status : "res", id : 3 },
{ status : "err", id : 4 },
]
} ...
有了这个,我可以计算状态 err 以连续顺序出现的频率。
但我不知道如何编写这个 group 阶段。
最佳答案
将此作为 aggregation framework 处理的问题问题是没有将一个文档与另一个文档进行比较的实际概念,因为所有操作要么一次对单个文档进行操作,要么将文档组合在一起。
因此,找到“连续”条目需要一个“全局”变量空间才能跨文档工作。聚合框架没有这样做,但问题可以用 mapReduce 解决。 :
db.consFieldTest.mapReduce(
function() {
if ( lastSeen != this.status ) {
lastSeen = this.status;
list = [];
counter = 0;
}
list.push(this._id);
counter++;
emit(lastSeen,{ "list": list, "count": counter });
},
function(key,values) {
var mapped = values.map(function(x) { return x.count });
return values[mapped.indexOf(Math.max.apply(Math,mapped))];
},
{
"scope": { "lastSeen": null, "list": [], "counter": 0 },
"out": { "inline": 1 }
}
)
简而言之,这将为当前的“状态”值发出一个“键”,同时保留跟踪连续出现的“列表”和“计数器”的全局变量。列表将在这里建立,仅使用 _id 中的数值作为示例,但可以是任何内容:
{ "_id": "err", "values": { "list": [1], "count": 1 }}
{ "_id": "suc", "values": { "list": [2], "count": 1 }}
{ "_id": "res", "values": { "list": [3], "count": 1 }}
{ "_id": "res", "values": { "list": [3,4], "count": 2 }}
{ "_id": "err", "values": { "list": [5], "count": 1 }}
{ "_id": "err", "values": { "list": [5,6], "count": 2 }}
{ "_id": "err", "values": { "list": [5,6,7], "count":3 }}
这基本上就是映射器发出的内容。请注意那里的全局变量的构建。
在 reduce 函数中,所有相同的键一起处理,或者至少在相同键的“组”中,因为这里的 reducer 工作。因此,所有的 reduce 函数都是在该组中找到具有最大计数的值,并返回匹配索引处的奇异项。
你得到的结果本质上是:
{ "_id": "err", "value": { "list": [5,6,7], "count":3 }}
{ "_id": "res", "value": { "list": [3,4], "count": 2 }}
{ "_id": "suc", "value": { "list": [2], "count": 1 }}
mapReduce 按“键”顺序发出最终结果。
是的,JavaScript 评估运行起来比聚合框架慢一点,但是如果没有在文档范围内跟踪全局变量的能力,这就是无法通过其他方式完成的事情。
关于javascript - 计算连续字段出现的最高数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25117284/
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我正在尝试在配备ARMv7处理器的SynologyDS215j上安装ruby2.2.4或2.3.0。我用了optware-ng安装gcc、make、openssl、openssl-dev和zlib。我根据README中的说明安装了rbenv(版本1.0.0-19-g29b4da7)和ruby-build插件。.这些是随optware-ng安装的软件包及其版本binutils-2.25.1-1gcc-5.3.0-6gconv-modules-2.21-3glibc-opt-2.21-4libc-dev-2.21-1libgmp-6.0.0a-1libmpc-1.0.2-1libm
我几天前在我的rubyonrails2.3.2上安装了Sphinx和Thinking-Sphinx,基本搜索效果很好。这意味着,没有任何条件。现在,我想用一些条件过滤搜索。我有公告模型,索引如下所示:define_indexdoindexestitle,:as=>:title,:sortable=>trueindexesdescription,:as=>:description,:sortable=>trueend也许我错了,但我注意到只有当我将:sortable=>true语法添加到这些属性时,我才能将它们用作搜索条件。否则它找不到任何东西。现在,我还在使用acts_as_tag