【问题标题】:How to add every other columns together in Mongo?如何在 Mongo 中将所有其他列添加在一起?
【发布时间】:2019-04-04 02:45:47
【问题描述】:

在 Mongo 的聚合过程中,我一直在为将每个“其他”列添加在一起而烦恼。

我的数据样本:

[
{'item': 'X',
'USA': 3,
'CAN': 1,
'CHN': 1,
'IDN': 1,
   :
   :
   :
},
{'item': 'R',
'USA': 2,
'CAN': 2,
'CHN': 1,
'IDN': 2,
   :
   :
   :
}
]

在聚合阶段,我想要一个名为“其他”的新字段,它是所有字段总和的结果未指定

我想要的结果是这样的:

[
{'item': 'X',
'NAM': 79,
'IDN': 51,
'OTHER': 32
},
{'item': 'R',
'NAM': 42,
'IDN': 11,
'OTHER': 20
}
]

到目前为止,我能得到的最接近的是使用这个:

mycoll.aggregate([
{'$addFields':{
            'NAM': {'$add':[{'$ifNull':['$CAN', 0]},{'$ifNull':['$USA', 0]}]},
            'INDIA': {'$ifNull':['$IDN', 0]},
            'OTHER': /* $add all the fields that are not $USA, $CAN, $IDN*/
}},
])

蒙古大师们,请开导这个可怜的灵魂。深深地欣赏它。谢谢!

【问题讨论】:

  • 你能解释一下吗/ $add 所有不是$USA, $CAN, $IDN*/*的字段
  • 我想将那些不是 USA、CAN、IDN 的字段添加到一起创建一个新字段 'OTHER'

标签: mongodb nosql aggregation-framework nosql-aggregation


【解决方案1】:

一般来说,我们的想法是将您的文档转换为一个数组,这样我们就可以在忽略不需要的字段的同时对其进行迭代。

 {
     '$addFields': {
         'NAM': {'$add': [{'$ifNull': ['$CAN', 0]}, {'$ifNull': ['$USA', 0]}]},
         'INDIA': {'$ifNull': ['$IDN', 0]},
         "OTHER": {
             $reduce:
                 {
                     input: {"$objectToArray": "$$ROOT"},
                     initialValue: {sum: 0},
                     in: {
                         sum: {
                             $cond: {
                                 if: {$in: ["$$this.k", ['_id', "item", "CAN", "USA", "IDN"]]},
                                 then: "$$value.sum",
                                 else: {$add: ["$$value.sum", "$$this.v"]}
                             }
                         }
                     }
                 }
         }

     }
 }

显然,您还应该在文档中添加您不想总结/不是数字类型的任何其他字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多