jjzjj

mongodb - 在同一聚合中聚合小计和应税小计

coder 2023-10-30 原文

我有一个包含包的数据模型,每个包都有一组产品文档。 每个产品文档都有一个价格和一个 isTaxable:boolean 字段

我可以在获取每个包裹 (product.price $sum) 的小计时进行汇总,但我无法弄清楚如何“同时”在同一汇总中获取 taxSubtotal,这将包括获取一个单独的product.price 的总和,其中 product.isTaxable 为真

这是包裹记录的样子:

// Package
   {
    _id: 1,
    packTitle: "Package 1",
    productCategory: {_id:90, label:"Clothing"},
    products: [
          {   _id:500, 
             "prodTitle": "Product 1",
             "price": 2.99,
             "isTaxable" : true
          },
          {   _id:501, 
             "prodTitle": "Product 2",
             "price": 4.99,
             "isTaxable" : false
          },
          {   _id:502, 
             "prodTitle": "Product 3",
             "price": 6.99,
             "isTaxable" : true
          },
          {   _id:503, 
             "prodTitle": "Product 4",
             "price": 10.99,
             "isTaxable" : false
          }
    ]
}

我可以通过以下方式获得小计:

db.prodPacks.aggregate([
    {$match: { "productCategory._id": {$in:[90]} }}
  , {$unwind: '$products'}
  , {$group: {
            '_id': {'packId':'$_id', 'packTitle':'$packTitle'},  
            'packSubtotal': {$sum: '$products.price' },
            'products':{'$push':'$products.title'}
            }
    }

])

我有 packSubtotal,我还想得到一个 taxableSubtotal(如果可能的话,在同一个聚合中,isTaxable 为 true 的 product.price 的总和。

我知道我可以使用 isTaxable 上的匹配项进行单独的聚合,然后获取小计并手动将它们相加,但我很好奇是否有一种方法可以在一次聚合中完成所有操作。

最佳答案

要获取“isTaxable”为 true 的“product.price”的总和,您需要使用 $cond条件聚合运算符。

db.packages.aggregate([ 
    { "$match": { "productCategory._id": 90 } }, 
    { "$unwind": "$products" }, 
    { "$group": { 
        "_id": { 
            "packId": "$_id", 
            "packTitle": "$packTitle" 
        },
        "packSubtotal": { "$sum": "$products.price" }, 
        "products": { "$push": "$products.prodTitle" }, 
        "taxableSubtotal": { 
            "$sum": { 
                "$cond": [ "$products.isTaxable", "$products.price", 0 ] 
            } 
        } 
    }}
])

关于mongodb - 在同一聚合中聚合小计和应税小计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37288447/

有关mongodb - 在同一聚合中聚合小计和应税小计的更多相关文章

  1. ruby - Highline 询问方法不会使用同一行 - 2

    设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案

  2. ruby - Rails 关联 - 同一个类的多个 has_one 关系 - 2

    我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下

  3. ruby - 在 Ruby 中,为什么 Array.new(size, object) 创建一个由对同一对象的多个引用组成的数组? - 2

    如thisanswer中所述,Array.new(size,object)创建一个数组,其中size引用相同的object。hash=Hash.newa=Array.new(2,hash)a[0]['cat']='feline'a#=>[{"cat"=>"feline"},{"cat"=>"feline"}]a[1]['cat']='Felix'a#=>[{"cat"=>"Felix"},{"cat"=>"Felix"}]为什么Ruby会这样做,而不是对object进行dup或clone? 最佳答案 因为那是thedocumenta

  4. ruby 变量作为同一对象(指针?) - 2

    >>a=5=>5>>b=a=>5>>b=4=>4>>a=>5如何将“b”设置为实际的“a”,以便在示例中,变量a也将变为4。谢谢。 最佳答案 classRefdefinitializeval@val=valendattr_accessor:valdefto_s@val.to_sendenda=Ref.new(4)b=aputsa#=>4putsb#=>4a.val=5putsa#=>5putsb#=>5当您执行b=a时,b指向与a相同的对象(它们具有相同的object_id).当你执行a=some_other_thing时,a将指向

  5. ruby - ruby 中的同一个程序如何接受来自用户的输入以及命令行参数 - 2

    我的ruby​​脚本从命令行参数获取某些输入。它检查是否缺少任何命令行参数,然后提示用户输入。但是我无法使用gets从用户那里获得输入。示例代码:test.rbname=""ARGV.eachdo|a|ifa.include?('-n')name=aputs"Argument:#{a}"endendifname==""puts"entername:"name=getsputsnameend运行脚本:rubytest.rbraghav-k错误结果:test.rb:6:in`gets':Nosuchfileordirectory-raghav-k(Errno::ENOENT)fromtes

  6. ruby - 在 factory_girl 中有没有办法获取 attributes_for 并为同一个实例元素创建? - 2

    如果我想使用“create”构建策略创建和实例,然后想使用“attributes_for”构建策略进行验证,是否可以这样做?如果我在工厂中使用序列?在Machinistgem中有可能吗? 最佳答案 不太确定我是否完全理解。而且我不是机械师的用户。但听起来您只是想做这样的事情。@attributes=FactoryGirl.attributes_for(:my_object)my_object=MyObject.create(@attributes)my_object.some_property.should==@attributes

  7. 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

  8. ruby - 如何让几条 haml 线出现在同一行上? - 2

    我有以下haml:9%strongAskedby:10=link_to@user.full_name,user_path(@user)11.small="(#{@question.created_at.strftime("%B%d,%Y")})"这当前将链接和日期放在不同的行上,当它看起来像“链接(日期)”并且日期的类跨度为小...... 最佳答案 您的代码将生成类似这样的html:Askedby:UsernameApril26,2011当您使用类似.small的东西(即使用点而不指定元素类型)时,haml会创建一个implicit

  9. c# - Ruby 等效于 C# Linq 聚合方法 - 2

    什么是Linq聚合方法的ruby​​等价物。它的工作原理是这样的varfactorial=new[]{1,2,3,4,5}.Aggregate((acc,i)=>acc*i);每次将数组序列中的值传递给lambda时,变量acc都会累积。 最佳答案 这在数学以及几乎所有编程语言中通常称为折叠。它是更普遍的变形概念的一个实例。Ruby从Smalltalk中继承了这个特性的名称,它被称为inject:into:(像aCollectioninject:aStartValueinto:aBlock一样使用。)所以,在Ruby中,它称为inj

  10. ruby - 在公差范围内确定两条线段是否属于同一线段的最有效方法是什么? - 2

    编辑:更改了标题。我对两个部分是否相同不太感兴趣,而是如果它们在一定的公差范围内彼此共线。如果是这样,那么这些线应该聚集在一起作为一个单独的线段。编辑:我想有一个简短的说法:我试图以一种有效的方式将相似的线段聚集在一起。假设我有线段f(fx0,fy0)和(fx1,fy1)和g(gx0,gy0)和(gx1,gy1)这些来自计算机视觉算法边缘检测器之类的东西,在某些情况下,两条线基本相同,但由于像素容差而被视为两条不同的线。有几种情况f和g共享完全相同的端点,例如:f=(0,0),(10,10)g=(0,0),(10,10)f和g共享大致相同的端点和大致相同的长度,例如:f=(0,0.01

随机推荐