Создайте массивы документов с наименьшим и наибольшим количеством на ключе группировки - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть коллекция ниже

[
  {
    _id: {
      giftId: "coin",
      userId: "5b839dfeaaafc94ff323da35"
    },
    count: 1
  },
  {
    _id: {
      giftId: "coin",
      userId: "5b8390cc4bf35e13fe67d545"
    },
    count: 2
  },
  {
    _id: {
      giftId: "Gold",
      userId: "5b8390cc4bf35e13fe67d545"
    },
    count: 3
  },
  {
    _id: {
      giftId: "Gold",
      userId: "5b8390cc4be35e13fe67d545"
    },
    count: 1
  },
  {
    _id: {
      giftId: "Silver",
      userId: "5b8390cc4bf35e13fe67d545"
    },
    count: 4
  },
  {
    _id: {
      giftId: "Silver",
      userId: "5b8390cc4bf35e13ff67d545"
    },
    count: 2
  }
]

Мне нужен вывод ниже

[{
    array1: [{
    _id: {
      giftId: "coin",
      userId: "5b8390cc4bf35e13fe67d545"
    },
    count: 2
  },
  {
    _id: {
      giftId: "Gold",
      userId: "5b8390cc4bf35e13fe67d545"
    },
    count: 3
  },
  {
    _id: {
      giftId: "Silver",
      userId: "5b8390cc4bf35e13fe67d545"
    },
    count: 4
  }],
    array2: [{
      _id: {
        giftId: "coin",
        userId: "5b839dfeaaafc94ff323da35"
      },
      count: 1
  }, {
    _id: {
      giftId: "Silver",
      userId: "5b8390cc4bf35e13ff67d545"
    },
    count: 2
      },{
    _id: {
      giftId: "Gold",
      userId: "5b8390cc4be35e13fe67d545"
    },
    count: 1
  }]
}]

Мне нужно считать для каждого giftId в массиве объектов.Предположим, что в приведенном выше документе для giftId монеты у нас есть 2 счета, а для giftId Золота у нас есть 3 счета, а для giftId Серебра у нас есть 4сосчитать.Таким образом, все значения с подсчетом высоты должны быть в одном массиве.

Любая помощь будет крайне полезна !!!

Я использую последнюю версию mongodb 4.0

1 Ответ

0 голосов
/ 25 сентября 2018

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

$sort для сортировки данных по количеству.

Initial $group, чтобы получить максимальный и минимальный элемент doc для каждого gift_id, за которым следует$group для вставки документов с максимальным и минимальным значением в массив.

db.colname.aggregate([
  {"$sort":{"count":-1}},
  {"$group":{"_id":"$_id.giftId","maxdoc":{"$first":"$$ROOT"}, "mindoc":{"$last":"$$ROOT"}}},
  {"$group":{"_id":null,"array1":{"$push":{"_id":"$maxdoc._id", "count":"$maxdoc.count"}}, "array2":{"$push":{"_id":"$mindoc._id", "count":"$mindoc.count"}}}},
  {"$project":{"_id":0}}
])
...