我们有一个聚合查询转换几个子文档。我们想对这些投影值应用一些算术运算,例如 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'
我们应该怎么做才能得到$project中original_y和new_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/
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
请帮助我理解范围运算符...和..之间的区别,作为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)是
我知道我可以指定某些字段来使用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
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
当我使用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
我明白了: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
我几天前在我的rubyonrails2.3.2上安装了Sphinx和Thinking-Sphinx,基本搜索效果很好。这意味着,没有任何条件。现在,我想用一些条件过滤搜索。我有公告模型,索引如下所示:define_indexdoindexestitle,:as=>:title,:sortable=>trueindexesdescription,:as=>:description,:sortable=>trueend也许我错了,但我注意到只有当我将:sortable=>true语法添加到这些属性时,我才能将它们用作搜索条件。否则它找不到任何东西。现在,我还在使用acts_as_tag
假设您编写了一个类Sup,我决定将其扩展为SubSup。我不仅需要了解你发布的接口(interface),还需要了解你的私有(private)字段。见证这次失败:classSupdefinitialize@privateField="fromsup"enddefgetXreturn@privateFieldendendclassSub问题是,解决这个问题的正确方法是什么?看起来子类应该能够使用它想要的任何字段而不会弄乱父类(superclass)。编辑:equivalentexampleinJava返回"fromSup",这也是它应该产生的答案。 最佳答案