草庐IT

javascript - Mongo 在二维数组的单个字段上设置交集

coder 2023-11-04 原文

我在 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/

有关javascript - Mongo 在二维数组的单个字段上设置交集的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby-openid:执行发现时未设置@socket - 2

    我在使用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

  3. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  4. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样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上找到一

  5. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  6. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  7. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  8. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  9. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  10. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

随机推荐