Сумма поменяла Массивы на Монгодб - PullRequest
0 голосов
/ 28 марта 2020

Предположим, у меня следующая ситуация на mongodb:

{
  "_id" : 654321,
  "first_name" : "John",
  "demand" : [1, 20, 4, 10 ],
  "group" : [1, 2]
}

{
  "_id" : 654321,
  "first_name" : "Bert",
  "demand" : [4, 10 ],
  "group" : [1, 3]
}

1 - возможно ли группирование по первому индексу массива "group" ([1])?

2- Можно ли изменить порядок индексов и суммировать эти массивы спроса по вертикали?

Желаемый результат:

1 - только выбор group.0 : 1

2 - обратный порядок массива $reverseArray

[1, 20, 4, 10 ] -> [10, 4, 20, 1] (reversed)
[4, 10] -> [10, 4] (reversed)

3 - сумма (вертикальная ось)

[20, 8, 20, 1]

Наконец, вернуть нормальный порядок:

[1, 20, 8, 20]

1 Ответ

0 голосов
/ 28 марта 2020

1 - Возможно ли группирование по первому индексу массива «group» ([1])?

Чтобы получить первую позицию индекса (то есть 0 ; индексы массива начинаются с 0), используйте оператор агрегирования $arrayElemAt:

db.collection.aggregate([ { $group: { _id: { $arrayElemAt: [ "$group", 0 ] } } }, ] )


2 - можно ли изменить порядок индексов, и суммировать эти массивы запросов по вертикали?

Вы можете перевернуть массив, используя оператор агрегирующего массива $reverseArray.

Чтобы получить сумму значений позиции каждого элемента массива, (i) получите индекс каждого значения с размоткой и, наконец, (ii) сгруппируйте по индексу и суммируйте значения.

db.collection.aggregate( [
  { 
      $addFields: { 
          demand: { $reverseArray: "$demand" } 
      } 
  },
  { 
      $unwind: { path: "$demand", includeArrayIndex: "ix" }
  },
  { 
      $group: {
           _id: "$ix", 
           sum: { $sum: "$demand" } 
      } 
  },
  { 
      $sort: { _id: 1 }    // this is optional; sorts by index position
  }
] )
...