草庐IT

mongodb - 带有嵌入式文档的 Mongodb 聚合

coder 2023-11-05 原文

我有一个这样的产品系列,经过简化:

[
  {
    "_id": 1,
    "ref": "product 1",
    "variants": [
      {
        "ref": "variant 1.1",
        "categories": ["category a"]
      },
      {
        "ref": "variant 1.1",
        "categories": ["category a","category b"]
      }
    ]
  },
  {
    "_id": 2,
    "ref": "product 2",
    "variants": [
      {
        "ref": "variant 2.1",
        "categories": ["category c"]
      },
      {
        "ref": "variant 2.1",
        "categories": ["category a","category c"]
      }
    ]
  }
]

我想查询类别(不同)及其包含产品(不是变体)的数量。

例如一些这样的结果:

[
  "category a": 2,
  "category b": 1,
  "category c": 1
]

我尝试了一些聚合和展开的查询,但我无法弄清楚。感谢所有帮助!

这是我目前所拥有的:

[
  {$match: ... }, // optional filtering
  {$unwind: '$variants'},
  {$unwind: '$variants.categories'},
]

但现在无法弄清楚,如何按类别分组,以及该类别中所有产品(不是变体)的总数。

最佳答案

db.products.aggregate([
    {$unwind: "$variants"},
    {$unwind: "$variants.categories"},
    {$group: {_id:"$_id", categories: {$addToSet:"$variants.categories"}}},
    {$unwind: "$categories"},
    {$group: {_id: "$categories", count: {$sum:1}}}
])

输出:

{ "_id" : "category b",  "count" : 1 }
{ "_id" : "category c",  "count" : 1 }
{ "_id" : "category a",  "count" : 2 }

解释。前两个展开运算符将从嵌套数组中取出类别,您将拥有这样的文档

{
    "_id" : 1,
    "ref" : "product 1",
    "variants" : {
        "ref" : "variant 1.1",
        "categories" : "category a"
    }
},
{
    "_id" : 1,
    "ref" : "product 1",
    "variants" : {
        "ref" : "variant 1.1",
        "categories" : "category a"
    }
},
{
    "_id" : 1,
    "ref" : "product 1",
    "variants" : {
        "ref" : "variant 1.1",
        "categories" : "category b"
    }
},
...

接下来我进行分组以消除每个产品变体中的重复类别。结果:

{
    "_id" : 1,
    "categories" : [ 
        "category b", 
        "category a"
    ]
},
...

再放松一下,摆脱类别数组。

{
    "_id" : 1,
    "categories" : "category b"
},
{
    "_id" : 1,
    "categories" : "category a"
},
{
    "_id" : 2,
    "categories" : "category a"
},
{
    "_id" : 2,
    "categories" : "category c"
}

然后分组以计算每个产品中不同类别的数量。您将获得上面指定的输出。

关于mongodb - 带有嵌入式文档的 Mongodb 聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42717299/

有关mongodb - 带有嵌入式文档的 Mongodb 聚合的更多相关文章

  1. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

  2. ruby-on-rails - 带有 Zeus 的 RSpec 3.1,我应该在 spec_helper 中要求 'rspec/rails' 吗? - 2

    使用rspec-rails3.0+,测试设置分为spec_helper和rails_helper我注意到生成的spec_helper不需要'rspec/rails'。这会导致zeus崩溃:spec_helper.rb:5:in`':undefinedmethod`configure'forRSpec:Module(NoMethodError)对thisissue最常见的回应是需要'rspec/rails'。但这是否会破坏仅使用spec_helper拆分rails规范和PORO规范的全部目的?或者这无关紧要,因为Zeus无论如何都会预加载Rails?我应该在我的spec_helper中做

  3. Ruby:如何使用带有散列的 'send' 方法调用方法? - 2

    假设我有一个类A,里面有一些方法。假设stringmethodName是这些方法之一,我已经知道我想给它什么参数。它们在散列中{'param1'=>value1,'param2'=>value2}所以我有:params={'param1'=>value1,'param2'=>value2}a=A.new()a.send(methodName,value1,value2)#callmethodnamewithbothparams我希望能够通过传递我的哈希以某种方式调用该方法。这可能吗? 最佳答案 确保methodName是一个符号,而

  4. ruby-on-rails - 带有 Pry 的 Rails 控制台 - 2

    当我进入Rails控制台时,我已将pry设置为加载代替irb。我找不到该页面或不记得如何将其恢复为默认行为,因为它似乎干扰了我的Rubymine调试器。有什么建议吗? 最佳答案 我刚发现问题,pry-railsgem。忘记了它的目的是让“railsconsole”打开pry。 关于ruby-on-rails-带有Pry的Rails控制台,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/question

  5. 带有 attr_accessor 的类上的 Ruby instance_eval - 2

    我了解instance_eval和class_eval之间的基本区别。我在玩弄时发现的是一些涉及attr_accessor的奇怪东西。这是一个例子:A=Class.newA.class_eval{attr_accessor:x}a=A.newa.x="x"a.x=>"x"#...expectedA.instance_eval{attr_accessor:y}A.y="y"=>NoMethodError:undefinedmethod`y='forA:Classa.y="y"=>"y"#WHATTT?这是怎么回事:instance_eval没有访问我们的A类(对象)然后它实际上将它添加到

  6. Ruby 等同于 Sphinx 文档生成器? - 2

    Ruby有一些不错的文档生成器,例如Yard、rDoc,甚至Glyph。问题是Sphinx可以做网站、PDF、epub、LaTex等。它在重组文本中完成所有这些事情。在Ruby世界中有替​​代方案吗?也许是程序的组合?如果我也能使用Markdown就更好了。 最佳答案 自1.0版以来,Sphinx有了“域”的概念,它是从Python和/或C以外的语言标记代码实体(如方法调用、对象、函数等)的方法。有一个rubydomain,所以你可以只使用Sphinx本身。您唯一会缺少的(我认为)是Sphinx使用autodoc从源代码自动创建文档

  7. ruby-on-rails - Rails 渲染带有驼峰命名法的 json 对象 - 2

    我在一个简单的RailsAPI中有以下Controller代码:classApi::V1::AccountsControllerehead:not_foundendendend问题在于,生成的json具有以下格式:{id:2,name:'Simpleaccount',cash_flows:[{id:1,amount:34.3,description:'simpledescription'},{id:2,amount:1.12,description:'otherdescription'}]}我需要我生成的json是camelCase('cashFlows'而不是'cash_flows'

  8. ruby-on-rails - 在 Ruby 或 Rails 中,hash.merge({ :order => 'asc' }) can return a new hash with a new key. 什么可以返回带有已删除键的新散列? - 2

    在Ruby(或Rails)中,我们可以做到new_params=params.merge({:order=>'asc'})现在new_params是一个带有添加键:order的散列。但是是否有一行可以返回带有已删除key的散列?线路new_params=params.delete(:order)不会工作,因为delete方法返回值,仅此而已。我们必须分3步完成吗?tmp_params=paramstmp_params.delete(:order)returntmp_params有没有更好的方法?因为我想做一个new_params=(params[:order].blank?||para

  9. ruby - Rails Elasticsearch 聚合 - 2

    不知何故,我似乎无法获得包含我的聚合的响应...使用curl它按预期工作:HBZUMB01$curl-XPOST"http://localhost:9200/contents/_search"-d'{"size":0,"aggs":{"sport_count":{"value_count":{"field":"dwid"}}}}'我收到回复:{"took":4,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":90,"max_score":0.0,"hits":[]},"a

  10. ruby-on-rails - 在 irb 中阅读文档 - 2

    我怀念ipython的一件事是它有一个?为特定功能挖掘文档的运算符。我知道ruby​​有一个类似的命令行工具,但是我在irb中调用它非常不方便。ruby/irb有类似的东西吗? 最佳答案 Pry是IPython的Ruby版本,它支持?命令来查找有关方法的文档,但语法略有不同:pry(main)>?File.dirnameFrom:file.cinRubyCore(CMethod):Numberoflines:6visibility:publicsignature:dirname()Returnsallcomponentsofthef

随机推荐