jjzjj

performance - MongoDB:按名称未知的子文档排序

coder 2023-11-04 原文

我有一个像这样的 MongoDB 集合:

{
 id: "213",
 sales : {
     '2014-05-23': {
        sum: 23
     },
     '2014-05-22': {
        sum: 22    
     }
 }
},

{
 id: "299",
 sales : {
     '2014-05-23': {
        sum: 44
     },
     '2014-05-22': {
        sum: 19    
     }
 }
},

我正在寻找一个查询,以让我的集合中的所有文档按总和排序(总和最大的文档...)。

对于示例数据,它应该返回如下内容:

{
 id: "299",
 sales : {
     '2014-05-23': {
        sum: 44
     },
     '2014-05-22': {
        sum: 19    
     }
 }
},
 {
 id: "213",
 sales : {
     '2014-05-23': {
        sum: 23
     },
     '2014-05-22': {
        sum: 22    
     }
 }
},

因为:和44最大,所以集合中的这个文档先显示。

这可能(并且足够快)吗?否则我可以重新设计数据库 - 也许有人对此有建议?

最佳答案

这样做的性能很糟糕,因为您放弃了最好的选择,即聚合框架。

您在这里违反的主要规则是“不要使用数据作为键”。

因此,当您使用实际上是数据点的“键”命名“子文档”时,就没有简单的方法来处理它们。一般的 MongoDB 符号不喜欢这样,你被迫进行 JavaScript 评估。这仍然是“ Sprite ”,但与 native 方法相比确实

改变你的模式,然后你就可以使用聚合框架了。首先是更改:

{
    "_id": 123,
    "sales": [
        { "date": ISODate("2014-05-23T00:00:00Z"), "sum": 23 },
        { "date": ISODate("2014-05-22T00:00:00Z"), "sum": 22 }
    ]
},
{
    "_id": 299,
    "sales": [
        { "date": ISODate("2014-05-22T00:00:00Z"), "sum": 19 },
        { "date": ISODate("2014-05-23T00:00:00Z"), "sum": 44 }
    ]
}

现在你的数据在一个数组中并且“路径”是一致的,这意味着你可以很容易地排序:

db.collection.find().sort({ "sales.sum": -1 })

因此具有“最大”“sales.sum”值的文档将排在第一位。

如果给出上面的示例,您还想按最大的“sales.sum”对内部数组元素进行“排序”,那么您可以使用聚合框架:

db.collection.aggregate([
    { "$unwind": "$sales" },
    { "$sort": { "_id": 1, "sales.sum": -1 } },
    { "$group": {
        "_id": "$_id",
        "sales": { "$push": "$sales" }
    }},
    { "$sort": { "sales.sum": -1 } }
])

可以通过将 JavaScript 评估与 mapReduce 一起使用来以这种方式处理您当前的文档,但不要这样做,因为它会慢得多。

关于performance - MongoDB:按名称未知的子文档排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24824397/

有关performance - MongoDB:按名称未知的子文档排序的更多相关文章

  1. ruby - 在 Ruby 中按名称传递函数 - 2

    如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只

  2. ruby-on-rails - 应用程序的名称是否可以作为变量使用? - 2

    当我创建一个Rails应用程序时,控制台:railsnewfoo我的代码可以使用字符串“foo”吗?puts"Yourapp'snameis"+app_name_bar 最佳答案 Rails.application.class将为您提供应用程序的全名(例如YourAppName::Application)。从那里您可以使用Rails.application.class.parent获取模块名称。 关于ruby-on-rails-应用程序的名称是否可以作为变量使用?,我们在StackOve

  3. ruby-on-rails - 如何从过时的 TZInfo 标识符中获取 Rails TimeZone 名称? - 2

    已经有一个问题回答了如何将“America/Los_Angeles”转换为“PacificTime(US&Canada)”。但是我想将“美国/太平洋”和其他过时的时区转换为RailsTimeZone。我无法在图书馆中找到任何可以帮助我完成此任务的东西。 最佳答案 来自RailsActiveSupport::TimeZonedocs:TheversionofTZInfobundledwithActiveSupportonlyincludesthedefinitionsnecessarytosupportthezonesdefinedb

  4. ruby-on-rails - 需要帮助最大化多个相似对象中的 3 个因素并适当排序 - 2

    我需要用任何语言编写一个算法,根据3个因素对数组进行排序。我以度假村为例(如Hipmunk)。假设我想去度假。我想要最便宜的地方、最好的评论和最多的景点。但是,显然我找不到在所有3个中都排名第一的方法。Example(assumingthereare20importantattractions):ResortA:$150/night...98/100infavorablereviews...18of20attractionsResortB:$99/night...85/100infavorablereviews...12of20attractionsResortC:$120/night

  5. ruby - 解释为局部变量会覆盖方法名称吗? - 2

    如thisquestion,当在其自己的赋值中使用未定义的局部变量时,它的计算结果为nil。x=x#=>nil但是当局部变量的名称与现有的方法名称冲突时,就比较棘手了。为什么下面的最后一个示例返回nil?{}.instance_eval{a=keys}#=>[]{}.instance_eval{keys=self.keys}#=>[]{}.instance_eval{keys=keys}#=>nil 最佳答案 在Ruby中,因为可以在没有显式接收器和括号的情况下调用方法,所以在局部变量引用和无接收器无参数方法调用之间存在语法歧义:f

  6. ruby-on-rails - 在具有 ActiveRecord 条件的相关模型中按字段排序 - 2

    我正在尝试按Rails相关模型中的字段进行排序。我研究的所有解决方案都没有解决如果相关模型被另一个参数过滤?元素模型classItem相关模型:classPriority我正在使用where子句检索项目:@items=Item.where('company_id=?andapproved=?',@company.id,true).all我需要按相关表格中的“位置”列进行排序。问题在于,在优先级模型中,一个项目可能会被多家公司列出。因此,这些职位取决于他们拥有的company_id。当我显示项目时,它是针对一个公司的,按公司内的职位排序。完成此任务的正确方法是什么?感谢您的帮助。PS-我

  7. ruby-on-rails - Resque - 类的未定义方法 'perform' - 2

    我目前对后台队列不太满意。我正在尝试让Resque工作。我已经安装了redis和Resquegem。Redis正在运行。一个worker正在运行(rakeresque:workQUEUE=simple)。使用Web界面,我可以看到工作人员正在运行并等待工作。当我运行“rakeget_updates”时,作业已排队但失败了。我已经用defself.perform和defperform试过了。发条.raketask:get_updates=>:environmentdoResque.enqueue(GetUpdates)end类文件(app/workers/get_updates.rb)c

  8. ruby-on-rails - 如何让 Rails View 返回其关联的操作名称? - 2

    我有一个非常简单的Controller来管理我的Rails应用程序中的静态页面:classPagesController我怎样才能让View模板返回它自己的名字,这样我就可以做这样的事情:#pricing.html.erb#-->"Pricing"感谢您的帮助。 最佳答案 4.3RoutingParametersTheparamshashwillalwayscontainthe:controllerand:actionkeys,butyoushouldusethemethodscontroller_nameandaction_nam

  9. ruby-on-rails - ActiveAdmin 自定义选择过滤器下拉名称 - 2

    对于用户模型,我有一个过滤器来检查用户的预订状态,该状态由整数值(0、1或2)表示。UserActiveAdmin索引页上的过滤器是通过以下代码实现的:filter:booking_status,as::select然而,这会导致下拉选项为0、1或2。当管理员用户从下拉列表中选择它们时,我更愿意自己将它们命名为“未完成”、“待定”和“已确认”之类的名称。有没有办法在不改变booking_status在模型中的表示方式的情况下做到这一点? 最佳答案 假设booking_status是模型中的枚举字段,您可以使用:过滤器:booking

  10. ruby - 按数字(从大到大)然后按字母(字母顺序)对对象集合进行排序 - 2

    我正在构建一个小部件来显示奥运会的奖牌数。我有一个“国家”对象的集合,其中每个对象都有一个“名称”属性,以及奖牌计数的“金”、“银”、“铜”。列表应该排序:1.首先是奖牌总数2.如果奖牌相同,按类型分割(金>银>铜,即2金>1金+1银)3.如果奖牌和类型相同,则按字母顺序子排序我正在用ruby​​做这件事,但我想语言并不重要。我确实找到了一个解决方案,但如果感觉必须有更优雅的方法来实现它。这是我做的:使用加权奖牌总数创建一个虚拟属性。因此,如果他们有2个金牌和1个银牌,加权总数将为“3.020100”。1金1银1铜为“3.010101”由于我们希望将奖牌数排序为最高的,因此列表按降序排

随机推荐