Подсчет документов и общая сумма их свойств массива, сгруппированных по нескольким свойствам поддокумента

#python #mongodb #pymongo

#питон #mongodb #пимонго

Вопрос:

Наличие N документов следующего типа:

 {  "source": {  "domain": "1",  "type": "2"  },  "assets": [1, 2] } {  "source": {  "domain": "3",  "type": "4"  },  "assets": [3, 4, 5] }  

Как я могу получить общее количество активов среди всех документов, сгруппированных по домену типу?

В приведенном выше случае запрос должен возвращать этот домен:1 тип:2 содержит 2 объединенных ресурса в 1 документе, в то время как домен3 тип:4 содержит 3 объединенных ресурса в 1 документе.

Обратите внимание, что domain:1 type:2 != domain:2 type:1 .

Моя первая попытка была

 collection.aggregate([  {  "$project": {  "_id": 0,  "arraySize":{"$size":"$assets"}  }  },  {  "$group": {  "_id": {"$concat": ["$source.domain", "-", "$source.type"]},  "totalArraysSize":{"$sum":"$arraySize"}  }  }, ])  

Но он только возвращается [{'_id': None, 'totalArraysSize': 616}] , без группировки.

Ответ №1:

Мне удалось написать решение после экспериментов с синтаксисом:

 collection.aggregate([{  "$group": {  "_id": {"source": "$source.domain", "type": "$source.type"},  "asset_count":{"$sum":{"$size":"$assets"}},  "total_count":{"$sum": 1},  } }])