mongodb - mongodb根据某些条件在数组中添加值
问题描述
我无法理解为每个“_id”字段文档添加一些值的mongodb聚合框架结构......如果这些值存在于字段“Wert”中。
例如,我有一个带有 _id 字段和条件的文档,ProduktTeilsummeDemonstrator":[]
或者"ProduktTeilsummeDemonstrator":[{Wert:342},{Wert:142}]
该数组可以为空或不为空,如果它为空,我想添加一个新字段"ProduktTeilsumme":0
,否则,我想将该数组中的所有值添加到新字段中。 ..
我拥有的数据如下所示:
[{"_id":230,"ProduktSummeDemonstrator":713,"ProduktTeilsummeDemonstrator":[],"ProduktTeilsumme":null},{"_id":855,"ProduktSummeDemonstrator":1744,"ProduktTeilsummeDemonstrator":[],"ProduktTeilsumme":null},{"_id":767,"ProduktSummeDemonstrator":1010,"ProduktTeilsummeDemonstrator":[{"Zeitstempel":"2018-07-09T15:07:32.472Z","Wert":24},{"Zeitstempel":"2018-07-09T15:07:32.472Z","Wert":102},{"Zeitstempel":"2018-07-09T14:52:32.473Z","Wert":15},{"Zeitstempel":"2018-07-09T14:52:32.472Z","Wert":20},{"Zeitstempel":"2018-07-09T15:07:32.472Z","Wert":90},{"Zeitstempel":"2018-07-09T14:52:32.472Z","Wert":104},{"Zeitstempel":"2018-07-09T15:07:32.473Z","Wert":29},{"Zeitstempel":"2018-07-09T14:52:32.472Z","Wert":94},{"Zeitstempel":"2018-07-09T14:52:32.473Z","Wert":33},{"Zeitstempel":"2018-07-09T15:07:32.473Z","Wert":245},{"Zeitstempel":"2018-07-09T14:52:32.473Z","Wert":243},{"Zeitstempel":"2018-07-09T15:07:32.473Z","Wert":11}],"ProduktTeilsumme":null},{"_id":9,"ProduktSummeDemonstrator":94,"ProduktTeilsummeDemonstrator":[],"ProduktTeilsumme":null}]
我用 $reduce 或 $cond 表达式尝试了不同的东西,但不知何故它不会加起来:(在计算阶段之前,我按 ID 分组并根据一些时间字段条件进行过滤..)
{
$project: {
ProduktSummeDemonstrator: "$ProduktSummeDemonstrator",
ProduktTeilsummeDemonstrator: {
$filter: {
input: "$res",
as: "res",
cond: { $and: [
{ $gte: ["$$res.Zeitstempel", new Date(req.params.start) ] },
{ $lte: ["$$res.Zeitstempel", new Date(req.params.end) ] }
] }
}
},
ProduktTeilsumme: {/*
$reduce: {
input: "$ProduktTeilsummeDemonstrator",
initialValue:0,
in: {
$add: ["$$value","$$this.Wert"]
}
} */
$cond: {
if: { $eq: [ "", "$ProduktTeilsummeDemonstrator" ] },
then: 0,
else: {
$reduce: {
input: "$ProduktTeilsummeDemonstrator",
initialValue: 0,
in: {
$add: ["$$value","$$this.Wert"]
}
}
}
}
}
}
}
至少"_id":767
我应该得到一些值,但我总是得到“空”。
解决方案
如果要同时保留数组和附加值,则必须使用多个项目阶段。一个 for $filter
ing ProduktTeilsummeDemonstrator
,然后将数组值相加。
就像是
[
{"$project":{
"ProduktSummeDemonstrator":1,
"ProduktTeilsummeDemonstrator":{
"$filter":{
"input":"$ProduktTeilsummeDemonstrator",
"as":"res",
"cond":{
"$and":[
{"$gte":["$$res.Zeitstempel", new Date(req.params.start)]},
{"$lte":["$$res.Zeitstempel", new Date(req.params.end)]}
]
}
}
}
}},
{"$project":{
"ProduktSummeDemonstrator":1,
"ProduktTeilsummeDemonstrator":1,
"ProduktTeilsumme":{"$sum":"$ProduktTeilsummeDemonstrator.Wert"}
}}
]
推荐阅读
- ruby-on-rails - 带有 Rails 5.1 的 Redis 打破了 Rspec
- java - 使用 opencv java 加载某些图像时,imread 返回 null
- ruby - 当出现“错误数量的参数”时,Ruby 会自动添加参数
- dictionary - 使用具有不可比较对象的 Map
- ios - 如何根据 iPhone 8、X 或 iPad 的屏幕尺寸更改代码
- android - 接受来电的有序广播不起作用
- sapui5 - SAP UI5 渲染内置按钮
- php - Wordpress 数据库连接错误 & 数据库未正常关闭
- c# - 使用键盘上的 Delete 按钮调用 DeleteButtonClick
- sorting - 如何根据关键字数据类型的嵌套字段对 Elasticsearch 结果进行排序?