Добавить пустые ведра в агрегации Монго - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть следующая агрегация:

const buckets = await StatisticModel.aggregate([
  {
    $bucket: {
      groupBy: '$ranking',
      boundaries: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11],
    },
  },
])

, которая возвращает следующий объект:

[
  {
    "_id": 3,
    "count": 6
  },
  {
    "_id": 4,
    "count": 98
  },
  {
    "_id": 5,
    "count": 81
  },
  {
    "_id": 6,
    "count": 25
  },
  {
    "_id": 7,
    "count": 4
  }
]

Как добавить недостающие (пустые) сегменты?

Это простой пример, но у меня есть более сложные примеры, в которых я генерирую границы и хочу вернуть во внешний интерфейс все сегменты, а не только заполненные.

1 Ответ

0 голосов
/ 14 февраля 2019

Вы можете использовать ниже агрегации

db.collection.aggregate([
  { "$facet": {
    "data": [
      { "$bucket": {
        "groupBy": "$ranking",
        "boundaries": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11]
      }}
    ]
  }},
  { "$addFields": {
    "data": {
      "$map": {
        "input": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11],
        "as": "i",
        "in": {
          "_id": "$$i",
          "count": {
            "$cond": [
              { "$eq": [{ "$indexOfArray": ["$data._id", "$$i"] }, -1] },
              0,
              { "$arrayElemAt": ["$data.count", { "$indexOfArray": ["$data._id", "$$i"] }] }
            ]
          }
        }
      }
    }
  }},
  { "$unwind": "$data" },
  { "$replaceRoot": { "newRoot": "$data" }}
])

Но лучше сделать с javascript

const array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11]
const array2 = [
  { "_id": 3, "count": 6 },
  { "_id": 4, "count": 98 },
  { "_id": 5, "count": 81 },
  { "_id": 6, "count": 25 },
  { "_id": 7, "count": 4 }
]

array.map((ar) => {
  const index = array2.map((e) => { return e._id }).indexOf(ar)
  if (index === -1) {
    array2.push({ _id: ar, count: 0 })
  }
})

console.log(array2)
...