草庐IT

node.js - 用于算术运算的 MongoDB 聚合 - 子文档字段

coder 2023-05-04 原文

我们有一个聚合查询转换几个子文档。我们想对这些投影值应用一些算术运算,例如 Sum 和 Product。

聚合查询 --

Item.aggregate([
        { $unwind: '$dummy'},       
        { $match: {'dummy.storage': {$gt: 0}} },
        { $group: {_id: '$_id',
                    dummy: {$push: '$dummy'},
                    original_y: { $first: "$original_y" },
                    new_y: { $first: "$new_y" },

        }},
        {$project:{
                  original_y: 1, new_y: 1,
                  tallyAmount: {$sum: ["$new_y","$original_y"] }
                }
        },
     ]
    )
    .exec(function(err, results){   
        if(err)
        {
            console.log("Error : " + err);
            return res.json ({error: "Error"});

        }
        else if(!(results) || results == null || results.length == 0)
        {
            console.log("No Results Found");
            return res.json ({error: "No Results Today"});

        }else{

            res.send(results);
        }
    });

这给出了一个错误说明 无效的运算符'$sum'

我们应该怎么做才能得到$projectoriginal_ynew_y之和?

编辑

文件:

{
 id:1,
 original_y: 200,
 new_y: 140,
 dummy: [
  {id:1, storage:2, cost: 10},
  {id:2, storage:0, cost: 20},
  {id:3, storage:5, cost: 30},
  ]
}

预期输出:

 {
     id:1,
     original_y: 200,
     new_y: 140,
     dummy: [
      {id:1, storage:2, cost: 10, tallyAmount: 34},
      {id:3, storage:5, cost: 30, tallyAmount: 11.33},
      ]
    }

在哪里, tallyAmount = (original_y + new_y)/成本

错误:无法为 dummy 的子字段添加表达式,因为已经存在适用于整个字段的表达式

最佳答案

如果没有您的文档架构和预期聚合结果的详细信息,我建议您尝试以下聚合,因为我相信您需要 $add运算符而不是 $sum运算符(operator)。请注意 $sum运算符仅适用于 $group运算符(operator)。与 $add运算符,它将两个数字/字段加在一起,结果存储在一个带有 $project 的新字段中运营商:

Item.aggregate([
    { "$match": { "dummy.storage": { "$gt": 0 } } },
    { "$unwind": "$dummy" },   
    { "$group": { 
        "_id": "$_id", 
        "original_y": { "$first": "$original_y" },
        "new_y": { "$first": "$new_y" }
    } },
    { "$project": {
        "original_y": 1, 
        "new_y": 1,
        "tallyAmount": { "$add": [ "$new_y", "$original_y" ] }
    } }
]).exec(callback);

-- 更新--

要满足条件tallyAmount = (original_y + new_y)/cost,您应该使用$add$divide $project 运算符管道阶段中的算术运算符,因此您的最终聚合管道将如下所示:

Item.aggregate([
    { "$match": { "dummy.storage": { "$gt": 0 } } },
    { "$unwind": "$dummy" },
    {
        "$project": {
            "original_y": 1, 
            "new_y": 1,
            "dummy.id": "$dummy.id",
            "dummy.storage": "$dummy.storage",
            "dummy.cost": "$dummy.cost",
            "dummy.tallyAmount": {
                "$divide": [
                    { "$add": ["$new_y","$original_y"] },
                    "$dummy.cost"
                ]
            }
        }
    },
    {
        "$group": {
            "_id": "_$id",
            "original_y": { "$first": "$original_y" },
            "new_y": { "$first": "$new_y" },
            "dummy": {
                "$addToSet": "$dummy"
            }
        }        
    }
 ]).exec(callback);

关于node.js - 用于算术运算的 MongoDB 聚合 - 子文档字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30032913/

有关node.js - 用于算术运算的 MongoDB 聚合 - 子文档字段的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

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

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

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

  4. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

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

  6. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  7. ruby - inverse_of 是否适用于 has_many? - 2

    当我使用has_one时,它​​工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290

  8. ruby - 带括号和 splat 运算符的并行赋值 - 2

    我明白了:x,(y,z)=1,*[2,3]x#=>1y#=>2z#=>nil我想知道为什么z的值为nil。 最佳答案 x,(y,z)=1,*[2,3]右侧的splat*是内联扩展的,所以它等同于:x,(y,z)=1,2,3左边带括号的列表被视为嵌套赋值,所以它等价于:x=1y,z=23被丢弃,而z被分配给nil。 关于ruby-带括号和splat运算符的并行赋值,我们在StackOverflow上找到一个类似的问题: https://stackoverflow

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

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

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

随机推荐