草庐IT

javascript - MongoDB 聚合中字段和数组的总和

coder 2023-11-05 原文

我有一个包含数组 an_array 的集合和一个字段 a_field .数组可以包含值(数组可以为空),这些值也可以存在于a_field 中。 .

我想创建一个聚合函数,对 a_field 中的值的数量求和或 an_array .

编辑:例如我想数多少次1用于 a_fieldan_array等等。

例如,如果我有一些如下所示的文档:

{
  a_field: 1,
  an_array: [ 1, 3, 4 ],
},
{
  a_field: 3,
  an_array: [],
}
{
  a_field: 2,
  an_array: [ 1 ],
}

我希望看到这样的输出:

[ { _id: 1, a_count: 1, b_count: 2 }, { _id: 2, a_count: 1, b_count: 0 }, { _id: 3, a_count: 1, b_count: 1 }, { _id: 4, a_count: 0, b_count: 1 } ]

但是我得到这样的输出:

[ { _id: 1, a_count: 1, b_count: 2 }, { _id: 3, a_count: 1, b_count: 1 }, { _id:4,  a_count: 1, b_count: 1 } ]

这是不正确的,因为它缺少 _id 2,和_id 4 计数过多。

然而,我面临的问题是当an_array为空,如果数组为空,我将无法正确检索所有计数,而且它获取 a_count 的值这并不总是与实际 ID 匹配(如 _id 4 中所示)。

我目前的情况是这样的:

db.getCollection('test').aggregate( [
    { $match: { 
        a_field: { 
            $ne: null 
        } 
    } },

    { $group: { 
        _id: '$a_field', 
        a_count: { 
            $sum: 1 
        }, 
        an_array: { 
            $push: {
                an_array: '$an_array'
            }
        }
     } },

    { $project: {
        an_array: 1,
        a_count: 1
    } },

    { $unwind: '$an_array' },
    { $unwind: '$an_array.an_array' },

    { $group: {
        _id: '$an_array.an_array',
        b_count: {
            $sum: 1
        },
        a_count: {
            $first: '$a_count'
        }
    } }, 
] );

我非常感谢您提供一些意见,因为我很乐意将其整合到一起。在这一点上,这更像是个人的追求,而不是实际的实现。谢谢!

编辑:我现在绑定(bind)到 MongoDB 2.6。

最佳答案

使用 $size 作为数组字段,这是 v2.6 的新功能,幸运的 child !

此外,我不明白您为什么要尝试对 $a_field 进行计数 - 总会有一个元素,因为它不是数组 - 所以此聚合仅包含 >$a_field 作为结果中的 _id。您知道 $a_field 的计数将始终为 1,因为它不是数组:

db.test.aggregate([{
  $match: {
    a_field: {
      $ne: null
    }
  }
}, {
 $group: {
    _id: '$a_field',
    an_array_size: {
      $size: '$an_array'
    }
  }
}])

示例控制台输出:

> db.test.find({});
{
  "_id": ObjectId("57ada868700ca97222421d8b"),
  "a_field": 1,
  "an_array": [1, 3, 4]
}

> db.test.aggregate([{
  $match: {
    a_field: {
      $ne: null
    }
  }
}, {
 $group: {
    _id: '$a_field',
    an_array_size: {
      $size: '$an_array'
    }
  }
}])
{
  "result": [{
    "_id": 1,
    "an_array_size": 3
  }],
  "ok": 1
}

关于javascript - MongoDB 聚合中字段和数组的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38915942/

有关javascript - MongoDB 聚合中字段和数组的总和的更多相关文章

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

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

  2. 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,如果没有检查,请帮助我,非常感谢,谢谢

  3. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  4. ruby - 鸭子输入字符串、符号和数组的优雅方式? - 2

    这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby​​。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac

  5. ruby-on-rails - Sphinx - 何时对字段使用 'has' 和 'indexes' - 2

    我几天前在我的ruby​​onrails2.3.2上安装了Sphinx和Thinking-Sphinx,基本搜索效果很好。这意味着,没有任何条件。现在,我想用一些条件过滤搜索。我有公告模型,索引如下所示:define_indexdoindexestitle,:as=>:title,:sortable=>trueindexesdescription,:as=>:description,:sortable=>trueend也许我错了,但我注意到只有当我将:sortable=>true语法添加到这些属性时,我才能将它们用作搜索条件。否则它找不到任何东西。现在,我还在使用acts_as_tag

  6. Ruby - 如何处理子类意外覆盖父类(super class)私有(private)字段的问题? - 2

    假设您编写了一个类Sup,我决定将其扩展为SubSup。我不仅需要了解你发布的接口(interface),还需要了解你的私有(private)字段。见证这次失败:classSupdefinitialize@privateField="fromsup"enddefgetXreturn@privateFieldendendclassSub问题是,解决这个问题的正确方法是什么?看起来子类应该能够使用它想要的任何字段而不会弄乱父类(superclass)。编辑:equivalentexampleinJava返回"fromSup",这也是它应该产生的答案。 最佳答案

  7. ruby-on-rails - 如何为空白字段编写 rspec? [Rails3.1] - 2

    我使用rails3.1+rspec和factorygirl。我对必填字段(validates_presence_of)的验证工作正常。我如何让测试将该事实用作“成功”而不是“失败”规范是:describe"Addanindustrywithnoname"docontext"Unabletocreatearecordwhenthenameisblank"dosubjectdoind=Factory.create(:industry_name_blank)endit{shouldbe_invalid}endend但是我失败了:Failures:1)Addanindustrywithnona

  8. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

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

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

  10. ruby-on-rails - Sunspot:如何对具有不同值的多个字段进行全文查询? - 2

    我想用sunspot重现以下原始solr查询q=exact_term_text:fooORterm_textv:foo*ORalternate_text:bar*但我无法通过标准的太阳黑子界面理解这是否可能以及如何实现,因为看起来:fulltext方法似乎不接受多个文本/搜索字段参数我不知道将什么参数作为第一个参数传递给fulltext,就好像我通过了"foo"或"bar"结果不匹配如果我传递一个空参数,我得到一个q=*:*范围过滤器(例如with(:term).starting_with('foo*')(顾名思义)作为过滤器查询应用,因此不参与评分。似乎可以手动编写字符串(或者可能使

随机推荐