首页 > 解决方案 > 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我应该得到一些值,但我总是得到“空”。

标签: mongodbaggregation-framework

解决方案


如果要同时保留数组和附加值,则必须使用多个项目阶段。一个 for $filtering 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"}
  }}
]

推荐阅读