我有这样的文档,
{
a : "123",
b : [
{
"start" : "2015-01-03",
"end" : "2015-01-05",
"name" : "xyz"
},
{
"start" : "2015-01-15",
"end" : "2015-01-17",
"name" : "abc"
}
]
},
{
a : "456",
b : [
{
"start" : "2015-01-04",
"end" : "2015-01-05",
"name" : "xyzd"
}
]
}
我正在尝试获取每天 b 的计数,例如,
2015-01-03 count: 1
2015-01-04 count: 2
2015-01-05 count: 2
2015-01-15 count: 1
2015-01-16 count: 1
2015-01-17 count: 1
如果日期被扩展,这可以通过简单的聚合来完成。是否可以扩展聚合的日期范围?
编辑:基本上对于给定的范围,我想扩展该范围并获取每天的计数,除非它与另一个范围重叠,否则它将是一个。
最佳答案
让我们检查以下场景,如果您的文档日期像下面给出的 ISODate 格式
[
{
"_id": ObjectId("552e71ec3420d7797e5ae682"),
"a": "123",
"b": [
{
"start": ISODate("2015-01-03T00:00:00Z"),
"end": ISODate("2015-01-05T00:00:00Z"),
"name": "xyz"
},
{
"start": ISODate("2015-01-15T00:00:00Z"),
"end": ISODate("2015-01-17T00:00:00Z"),
"name": "abc"
}
]
},
{
"_id": ObjectId("552e72063420d7797e5ae683"),
"a": "456",
"b": [
{
"start": ISODate("2015-01-04T00:00:00Z"),
"end": ISODate("2015-01-05T00:00:00Z"),
"name": "xyzd"
}
]
}
]
现在如果你想计算所有的开始日期然后简单使用下面的查询
db.collectionName.aggregate([
{
"$unwind": "$b"
},
{
"$group": {
"_id": "$b.start",
"count": {
"$sum": 1
}
}
},
{
"$project": {
"startDate": "$_id",
"count": "$count",
"_id": 0
}
}
])
同样用于结束日期,只需在组中替换 $b.start 到 $b.end 然后它显示结束日期计数
现在另一个问题是,如果您想从给定范围内找出开始 日期计数,然后使用下面的查询,假设开始 日期来自ISODate("2015-01 -03T00:00:00Z") 和 ISODate("2015-01-04T00:00:00Z") 范围
db.collectionName.aggregate([
{
"$unwind": "$b"
},
{
"$match": {
// check here date range matching documents
"$and": [
{
"b.start": {
"$gte": ISODate("2015-01-03T00:00:00Z")
}
},
{
"b.start": {
"$lte": ISODate("2015-01-04T00:00:00Z")
}
}
]
}
},
{
"$group": {
"_id": "$b.start",
"count": {
"$sum": 1
}
}
},
{
"$project": {
"startDate": "$_id",
"count": "$count",
"_id": 0
}
}
])
关于mongodb - 在 mongodb 中生成日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29649668/
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or
假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit
我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时
我正在尝试使用在我的代码中是动态的Time.local来安排时间。在每个月的第一天,我传递的值是Time.local(2009,9,-1,0)。在PHP中,这会将时间设置为上个月的最后一天。在ruby中,我只是得到“ArgumentError:参数超出范围”。是我用错了方法还是什么?谢谢。 最佳答案 您应该使用DateTime类而不是Time。(您可能需要先require'date'并安装activesupportgem。)它比Time更通用,并且可以用DateTime.civil(2009,9-1,-1,0)做你想做的事。为天
我想从rubyrake脚本运行一个可执行文件,比如foo.exe我希望将foo.exe的STDOUT和STDERR输出直接写入我正在运行rake任务的控制台.当进程完成时,我想将退出代码捕获到一个变量中。我如何实现这一目标?我一直在玩backticks、process.spawn、system但我无法获得我想要的所有行为,只有部分更新:我在Windows上,在标准命令提示符下,而不是cygwin 最佳答案 system获取您想要的STDOUT行为。它还返回true作为零退出代码,这可能很有用。$?填充了有关最后一次system调
我想检查my_number是否在某个范围内,包括较高的值。在IF语句中我会简单地使用“x>100&&x但是我应该在Ruby案例中做什么(开关)?使用:casemy_numberwhenmy_number不起作用。备注:标准范围不包括my_number恰好为500的情况,并且我不想添加第二个“when”,因为我必须编写双重内容casemy_number#between100and500when100..500puts"Correct,dosomething"when500puts"Correct,dosomethingagain"end 最佳答案
我有一个变量,想从该变量中获取一定范围的位。我想要最干净的方式来做到这一点。如果x=19767并且我想要bit3-bit8(从右边开始):100110100110111在二进制中是19767。我想要括号100110(100110)111中的部分,所以答案是38。用Ruby实现以下功能的最简单/最干净/最优雅的方法是什么?bit_range(orig_num,first_bit,last_bit)附言。计算强度较低的答案可加分。 最佳答案 19767.to_s(2)[-9..-4].to_i(2)或19767>>3&0x3f更新:从头