【问题标题】:How to add two collections with single aggregation如何使用单个聚合添加两个集合
【发布时间】:2018-09-08 14:33:25
【问题描述】:

我是 MongoDb 的新手,希望能在此查询方面提供一些帮助。我编写了以下聚合管道。我从collection1写了查询我得到了输出(“Conventional Energy”:0.0036),我写了查询collection2我得到了输出(LastMonthConsumption“:2.08)但是如何添加两个带有单个聚合的集合(LastMonthConsumption”:2.08 *常规能源“:0.0036/常规能源”:0.0036)这是我需要的输出

我在 mongodb 中有这些数据:

COLLECTION 1:DATA
{
    "slcId" : "51",
    "clientId" : "1",
    "dcuId" : "1",
    "type" : "L",
    "officeId" : "200-24",
    "lampStatus" : "OFF",
    "cummulativeKWH" : 133.7,
    "powerFactor" : 1.0,
    "createDate" : ISODate("2018-09-06T00:01:34.816Z")
},
{
    "slcId" : "52",
    "clientId" : "1",
    "dcuId" : "1",
    "type" : "L",
    "officeId" : "200-24",
    "lampStatus" : "OFF",
    "cummulativeKWH" : 133.7,
    "powerFactor" : 1.0,
    "createDate" : ISODate("2018-09-07T21:01:34.816Z")
}
COLLECTION2:DATA
{
    "_class" : "MongoStreetLightMonthlyVo",
    "timeId" : ISODate("2018-08-04T16:40:08.817Z"),
    "vendor" : "CIMCON",
    "slcId" : "123450",
    "mongoStreetLightChildVo" : {
        "totalConsumptionMtd" : 2.08,
        "prevConsumptionMtd" : 3.45,
        "perChargeKWH" : 9.85,

    }
},
{
    "_class" : "MongoStreetLightMonthlyVo",
    "timeId" : ISODate("2018-09-04T16:40:08.817Z"),
    "vendor" : "CIMCON",
    "slcId" : "123450",
    "mongoStreetLightChildVo" : {
        "totalConsumptionMtd" : 2.08,
        "prevConsumptionMtd" : 3.45,
        "perChargeKWH" : 9.85,

    }
}

集合1:

db.collection1.aggregate([

               { $match:{"type" : "L"}},
                {
                 $count: "TOTAL_Lights"
                },
                { "$project": { 
                  "Conventional Energy": {
                 "$divide": [ 
               { "$multiply": [
               { "$multiply": [ "$TOTAL_Lights" ,0.12 ] },

                 ]},
              1000
              ]
            } 
         }},

       ])

输出:{“传统能源”:0.0036}

集合2:

    db.collection2.aggregate(
    [
    // Stage 1
    {
        $group: {
         _id:{year:{$year:"$timeId"},month:{$month:"$timeId"} },
         LastMonthConsumption  : {$sum:"$mongoStreetLightChildVo.totalConsumptionMtd"}, 

        }
    },
    {
        $redact: {
          $cond: {  if: { $and:[
            {$eq: [ "$_id.year", {$year:new Date()} ]}, 
            {$eq: [-1, {$subtract:[ "$_id.month", {$month:new Date()} ]}]}
            ]},
                  then: "$$KEEP",
                  else: "$$PRUNE"
          }
        }
    },
    {$project:{
        _id:0,
        LastMonthConsumption :1

    }
}

]
);

输出:{ “上月消费”:2.08 }

预期输出:

LastMonthConsumption - Conventional Energy/Conventional Energy*100

【问题讨论】:

  • Hum, LastMonthConsumption * 常规能源/常规能源 = LastMonthConsumption *1 = LastMonthConsumption
  • sorry matthPen 我需要的输出:LastMonthConsumption-Conventional Energy/Conventional Energy*100 这是需要的输出请给我@matthPen
  • 值是负数还是正数,请给我建议@matthPen
  • 您能提供您的两个系列的样品吗?
  • 是的,我将更新示例数据,请查找并解决我的问题@matthPen

标签: mongodb mongoose mongodb-query aggregation-framework


【解决方案1】:

你可以试试下面的聚合

db.collection2.aggregate([
  { "$group": {
    "_id": { "year": { "$year": "$timeId" }, "month": { "$month": "$timeId" }},
    "LastMonthConsumption": { "$sum": "$mongoStreetLightChildVo.totalConsumptionMtd" }
  }},
  { "$redact": {
    "$cond": {
      "if": {
        "$and": [
          { "$eq": ["$_id.year", { "$year": new Date() }] },
          { "$eq": [-1, { "$subtract": ["$_id.month", { "$month": new Date() }] }]
          }
        ]
      },
      "then": "$$KEEP",
      "else": "$$PRUNE"
    }
  }},
  { "$lookup": {
    "from": "collection1",
    "pipeline": [
      { "$match": { "type": "L" } },
      { "$count": "TOTAL_Lights" },
      { "$project": {
        "ConventionalEnergy": {
          "$divide": [{ "$multiply": [{ "$multiply": ["$TOTAL_Lights", 0.12] }] }, 1000]
        }
      }}
    ],
    "as": "ConventionalEnergy"
  }},
  { "$project": {
    "_id": 0,
    "totalConsumption": {
      "$multiply": [
        {
          "$divide": [
            {
              "$subtract": [
                "$LastMonthConsumption",
                { "$arrayElemAt": ["$ConventionalEnergy.ConventionalEnergy", 0] }
              ]
            },
            { "$arrayElemAt": ["$ConventionalEnergy.ConventionalEnergy", 0] }         
          ]
        },
        100
      ]
    }
  }}
])

【讨论】:

  • 我会尝试这段代码抛出一些错误断言:命令失败:{“ok”:0,“errmsg”:“$lookup 的参数必须是字符串,管道:[ { $match: { type : \"L\" } }, { $count: \"TOTAL_Lights\" }, { $project: { ConventionalEnergy: { $divide: [ { $multiply: [ { $multiply: [ \"$TOTAL_Lights\", 0.12 ] } ] }, 1000.0 ] } } } ] 是类型数组", "code" : 4570, @Anthony Winzlet
  • 你的mongodb版本是多少?
  • 3.4.4 @ Anthony Winzlet
  • 3.6 没有更新我的系统,如果可能的话 3.4? @安东尼温兹莱特
  • Anthony Winzlet 我更新了 3.6 版本此代码运行良好感谢您的支持非常感谢您的帮助非常感谢@Anthony Winzlet
猜你喜欢
  • 2021-06-26
  • 2020-01-31
  • 1970-01-01
  • 2017-07-13
  • 2019-11-10
  • 1970-01-01
  • 2017-07-12
  • 2020-09-19
  • 2020-06-13
相关资源
最近更新 更多