Как добавить все остальные столбцы вместе в Монго? - PullRequest
1 голос
/ 04 апреля 2019

Я ломал голову над сложением всех «других» столбцов во время агрегации в Монго.

Пример моих данных:

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

На этапе агрегирования я хотел бы иметь новое поле с именем 'OTHER' , который является результатом суммирования всех полей, которые не указаны .

Мой желаемый результат таков:

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

Пока что ближайший Iможет получить, используя это:

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*/
}},
])

Монго гуру, пожалуйста, просветите эту бедную душу.Глубоко ценю это.Спасибо!

1 Ответ

2 голосов
/ 04 апреля 2019
in general the idea is converting your document to an array so we could iterate over it while ignoring unwanted fields.

    {
        '$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"]}
                                }
                            }
                        }
                    }
            }

        }
    }

obivously you should also add any other fields that you have in your document that you do not want to sum up / are not of type number.   
...