我正在尝试映射减少一堆数据以生成每日图表,问题是应用程序有来自世界各地的用户,他们希望数据在他们自己的时区。
我目前的 map 缩减非常简单
var map = function(){
var userLogin = this;
var d = this.StartTime;
var start = d.getFullYear() + '-' + d.getMonth() + 1, + '-' + d.getDate();
var reduceValue = {
SuccessSession: 0,
FailSession: 0
}
if(userLogin.ExitReason.Severity <2)
{
reduceValue.SuccessSession += 1;
} else {
reduceValue.FailSession += 1;
}
emit({ClientId: this.ClientId, StartDate:start, IsAdmin: this.IsAdmin},
{SuccessSession: reduceValue.SuccessSession, FailSession: reduceValue.FailSession })
}
和减少
var reduce = function(key, value) {
var reducedValue = {
SuccessSession: 0,
FailSession : 0
};
for(var idx = 0; idx < value.length; idx++)
{
reducedValue.SuccessSession += value[idx].SuccessSession;
reducedValue.FailSession += value[idx].FailSession;
}
return reducedValue;
};
这种方法的问题是它从午夜 UTC 计算到午夜 UTC,但是我更希望能够查询 Map Reduced 并且仍然能够根据用户所在的时区进行查询。
是否有任何简单的方法可以实现 mapreduce 并保持使用时区的能力?
最佳答案
没有简单的方法。 map 是一个 javascript,所以你至少需要那里的 IANA TZ 数据库。类似于 https://momentjs.com/timezone/在 map 功能中可用。
您会考虑聚合框架而不是 map-reduce 吗?它支持时区并且速度更快。管道可以像这样简单:
db.collection.aggregate([
{ $group: {
_id: {
ClientId: "$ClientId",
start: { $dateToString: {
format: "%Y-%m-%d",
date: "$StartTime",
timezone: "Europe/Kiev"
} },
IsAdmin: "$IsAdmin"
},
"SuccessSession": { $sum: { $cond: {
if: { $lt: [ "$ExitReason.Severity", 2 ] },
then: 1,
else: 0
} } },
"FailSession":{ $sum: { $cond: {
if: { $lt: [ "$ExitReason.Severity", 2 ] },
then: 0,
else: 1
} } },
} }
])
关于mongodb - map 减少与时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51204903/
我在非Rails项目中使用ActiveRecord。在Rails中,我可以这样做:config.time_zone='EasternTime(US&Canada)'config.active_record.default_timezone='EasternTime(US&Canada)'但如果我不使用rails,我该如何设置时区? 最佳答案 ActiveRecord::Base.default_timezone='EasternTime(US&Canada)' 关于ruby-没有轨道的A
我需要从json记录中获取一些值并像下面这样提取curr_json_doc['title']['genre'].map{|s|s['name']}.join(',')但对于某些记录,curr_json_doc['title']['genre']可以为空。所以我想对map和join()使用try函数。我试过如下curr_json_doc['title']['genre'].try(:map,{|s|s['name']}).try(:join,(','))但是没用。 最佳答案 你没有正确传递block。block被传递给参数括号外的方法
在我的场景中,Logstash收到的系统日志行的“时间戳”是UTC,我们在Elasticsearch输出中使用事件“时间戳”:output{elasticsearch{embedded=>falsehost=>localhostport=>9200protocol=>httpcluster=>'elasticsearch'index=>"syslog-%{+YYYY.MM.dd}"}}我的问题是,在UTC午夜,Logstash在外时区(GMT-4=>America/Montreal)结束前将日志发送到不同的索引,并且索引在20小时(晚上8点)之后没有日志,因为“时间戳”是UTC。我们已
Enumerable#each和Enumerable#map的区别在于返回的是接收者还是映射后的结果。回到接收者是微不足道的,你通常不需要在each之后继续一个方法链,比如each{...}.another_method(我可能没见过这样的案例。即使你想回到接收者那里,你也可以通过tap来实现)。所以我认为所有或者大部分使用Enumerable#each的情况都可以用Enumerable#map代替。我错了吗?如果我是对的,each的目的是什么?map是否比each慢?编辑:我知道当您对返回值不感兴趣时使用each是一种常见的做法。我对这种做法是否存在不感兴趣,但感兴趣的是,除了从
map遍历数组是否比each更快?两者有速度差异吗?mapresult=arr.map{|a|a+2}每个result=[]arr.eachdo|a|result.push(a+2)end 最佳答案 我认为是的。我试过这个测试require"benchmark"n=10000arr=Array.new(10000,1)Benchmark.bmdo|x|#Mapx.reportdon.timesdoresult=arr.map{|a|a+2}endend#Eachx.reportdon.timesdoresult=[]arr.each
我有一个这样的数组[1,1,2,3,3,3,4,5,5]我想计算每个数字出现的次数,我正在尝试这样做[1,1,2,3,3,3,4,5,5].reduce(Hash.new(0)){|hash,number|hash[number]+=1}问题是当我尝试运行它时出现以下错误NoMethodError:undefinedmethod`[]='for1:Fixnumfrom(irb):6:in`blockinirb_binding'from(irb):6:in`each'from(irb):6:in`reduce'from(irb):6我能像这样设置初始值吗,还是我弄错了?
我想念Ruby中的Hash方法来仅转换/映射散列值。h={1=>[9,2,3,4],2=>[6],3=>[5,7,1]}h.map_values{|v|v.size}#=>{1=>4,2=>1,3=>3}你如何在Ruby中归档它?更新:我正在寻找map_values()的实现。#moreexamplesh.map_values{|v|v.reduce(0,:+)}#=>{1=>18,2=>6,3=>13}h.map_values(&:min)#=>{1=>2,2=>6,3=>1} 最佳答案 Ruby2.4引入了方法Hash#tran
假设我有一个函数defodd_or_evennifn%2==0return:evenelsereturn:oddendend我有一个简单的可枚举数组simple=[1,2,3,4,5]然后我用我的函数在map中运行它,使用一个do-endblock:simple.mapdo|n|odd_or_even(n)end#=>[:odd,:even,:odd,:even,:odd]如果不首先定义函数,我怎么能做到这一点?例如,#doesnotworksimple.mapdo|n|ifn%2==0return:evenelsereturn:oddendend#Desiredresult:#=>[
我想获取一个数组并将其作为订单列表。目前我正在尝试以这种方式进行:r=["a","b","c"]r.each_with_index{|w,index|puts"#{index+1}.#{w}"}.map.to_a#1.a#2.b#3.c#=>["a","b","c"]输出应该是["1.a","2.b","3.c"]。如何让正确的输出成为r数组的新值? 最佳答案 a.to_enum.with_index(1).map{|element,index|"#{index}.#{element}"}或a.map.with_index(1){|
我看到有关未找到文件min.map的错误消息:GETjQuery'sjquery-1.10.2.min.mapistriggeringa404(NotFound)截图这是从哪里来的? 最佳答案 如果ChromeDevTools报告.map文件的404(可能是jquery-1.10.2.min.map、jquery.min.map或jquery-2.0.3.min.map,但任何事情都可能发生)首先要知道的是,这仅在使用DevTools时才会请求。您的用户不会遇到此404。现在您可以修复此问题或禁用sourcemap功能。修复:获取文