我在 mongo 中有以下结构的文档。我想获取 parent 中 child 的所有共同日期。
{"parent": 1, "child": "a", "date": "2016-02-01"},
{"parent": 1, "child": "a", "date": "2016-02-02"},
{"parent": 1, "child": "a", "date": "2016-02-03"},
{"parent": 1, "child": "b", "date": "2016-02-01"},
{"parent": 1, "child": "b", "date": "2016-02-03"},
{"parent": 2, "child": "a", "date": "2016-02-02"},
{"parent": 2, "child": "a", "date": "2016-02-03"},
{"parent": 2, "child": "b", "date": "2016-02-01"},
{"parent": 2, "child": "b", "date": "2016-02-02"}
为此,我使用聚合框架和以下管道来获取一组日期数组。
{
$group: {
_id: {
parent: "$parent",
child: "$child"
},
dates: {
$push: "$date"
}
}
}, {
$group: {
_id: "$_id.parent",
dates: {
$push: "$dates"
}
}
}
输出结果如下:
[
{
"_id" : 1,
"dates" : [
[
"2016-02-01",
"2016-02-03"
],
[
"2016-02-01",
"2016-02-02",
"2016-02-03"
]
]
},
{
"_id" : 2,
"dates" : [
[
"2016-02-01",
"2016-02-02"
],
[
"2016-02-02",
"2016-02-03"
]
]
}
]
我现在想要获取每个文档的二维数组中的所有公共(public)日期,并且我尝试使用 $setIntersection 添加一个 $projection 阶段。但据我了解,$setIntersection 需要一组定义明确的字段或数组 - 使用 $setIntersection: "$dates" 无法按预期工作。
感谢任何帮助!
附加信息:子类型的数量是可变的
预期输出:
[
{
"_id" : 1.0000000000000000,
"dates" : [
"2016-02-01",
"2016-02-03"
]
},
{
"_id" : 2.0000000000000000,
"dates" : [
"2016-02-02"
]
}
]
最佳答案
那么对于 MongoDB 3.2,您可以使用 $arrayElemAt获取两个维度的每个元素并将其提供给 $setIntersection :
db.collection.aggregate([
{ "$group": {
"_id": {
"parent": "$parent",
"child": "$child"
},
"dates": { "$push": "$date" }
}},
{ "$group": {
"_id": "$_id.parent",
"dates": { "$push": "$dates" }
}},
{ "$project": {
"dates": {
"$setIntersection": [
{ "$arrayElemAt": [ "$dates", 0 ] },
{ "$arrayElemAt": [ "$dates", 1 ] }
]
}
}}
])
但实际上,您正在查看的特定问题可以通过更简单的方式解决。基本上,您需要做的就是计算 parent 每个日期的 child 出现次数。大于一个表示有两个或更多 child 共享日期:
db.collection.aggregate([
{ "$group": {
"_id": {
"parent": "$parent",
"date": "$date"
},
"count": { "$sum": 1 }
}},
{ "$match": { "count": { "$gt": 1 } } },
{ "$group": {
"_id": "$_id.parent",
"dates": { "$push": "$_id.date" }
}}
])
因此没有理由比较数组,因为简单的分组元素计数就可以告诉您“集合交集”是什么。
同样的原则适用于引入聚合框架的每个 MongoDB 版本。
两者都给你相同的结果:
{ "_id" : 1, "dates" : [ "2016-02-03", "2016-02-01" ] }
{ "_id" : 2, "dates" : [ "2016-02-02" ] }
还要注意“集合”不被认为是有序的,$group 发出的键的顺序也不是。
关于javascript - Mongo 在二维数组的单个字段上设置交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35286243/
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby数组,我们在StackOverflow上找到一
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?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,如果没有检查,请帮助我,非常感谢,谢谢
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife