MongoDB GroupBy дочерний массив, но сумма родительская - PullRequest
0 голосов
/ 20 сентября 2019

Предположим, у меня есть:

[
{ProjectId: "1", PriceSold: 100, Item: {Name: "Package1", Specs: ["A", "B"]} } ,
{ProjectId: "2", PriceSold: 500, Item: {Name: "Package10", Specs: ["A", "C"]} } ,
{ProjectId: "3", PriceSold: 900, Item: {Name: "Package100", Specs: ["D", "E"]} } ,
{ProjectId: "4", PriceSold: 50, Item: {Name: "Package90", Specs: ["F"]} } ,
]

Я хотел бы сделать спецификации GroupBy, но суммировать родительский PriceSold.Результат будет:

[
{Spec: "A", Total: 600},
{Spec: "B", Total: 100},
{Spec: "C", Total: 500},
{Spec: "D", Total: 900},
{Spec: "E", Total: 900},
{Spec: "F", Total: 50},
]

Любая попытка агрегации возвращает мне группы спецификаций, а не элемент, и сумма не работает.Первая попытка:

db.ClientProject.aggregate([

{ "$group" : { "_id" : "$Item.Specs", "__agg0" : { "$sum" : "$PriceSold" } } }, 

{ "$project" : { "GroupId" : "$_id", "GroupSum" : "$__agg0", "_id" : 0 } }

])

Вторая попытка (она считается правильно, но я не могу сделать сумму PriceSold)

db.ClientProject.aggregate([

{ "$unwind" : "$Item.Specs" }, 

{ "$project" : { "Specs" : "$Item.Specs", "_id" : 0 } }, 

{ "$group" : { "_id" : "$Specs", "__agg0" : { "$sum" : 1 } } }, 

{ "$project" : { "GroupId" : "$_id", "GroupSum" : "$__agg0", "_id" : 0 } }])

1 Ответ

1 голос
/ 20 сентября 2019

Пожалуйста, попробуйте это:

db.ClientProject.aggregate([{$project : {PriceSold: 1, 'Item.Specs':1}}, {$unwind : '$Item.Specs'},
{$group : {_id : '$Item.Specs', Total: {$sum : '$PriceSold'}}}])

Примечание: В целом, использование $unwind для всей коллекции не так эффективно, было бы хорошей идеей использовать ее для небольшого набора данных, может бытьпосле фильтрации коллекции (как после $match), так как здесь у нас нет этой опции, по крайней мере, используя $project, чтобы в документе было меньше полей для работы.

...