Как сгруппировать заказы по диапазону данных в MongoDB? - PullRequest
1 голос
/ 08 февраля 2020

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

[
  {
    "_id": ObjectId("5e3dd3d57f8bc30a7513e843"),
    "deleted": true,
    "date": "01/01/2020"
    "total": 3
  },
  {
    "_id": ObjectId("5e3dd3e97f8bc30a7513e99b"),
    "date": "02/01/2020",
    "deleted": false,
    "total": 11
  },
  {
    "_id": ObjectId("5e3dd3e97f8bc30a75137635"),
    "date": "15/02/2020",
    "deleted": false,
    "total": 5
  },
  {
    "_id": ObjectId("5e3dd3e97f8bc30a75131725"),
    "date": "18/02/2020",
    "deleted": false,
    "total": 7
  },
  {
    "_id": ObjectId("5e3dd3e97f8bc30a75131725"),
    "date": "03/03/2020",
    "deleted": false,
    "total": 9
  }
]

Мне нужно объединить эти ордера по диапазону, чтобы получить что-то вроде этого:

{
"january": [order1, order2],
"february": [order3, order4],
"march": [order5]
}

конечно, нет нужны слова «январь, февраль» и др. c, что-то, что позволяет мне группировать по диапазонам данных. Примерно так:

db.sales.aggregate( [
   { $group: { date: { "$gte": new Date(req.query.minDate), "$lte": new Date(req.query.maxDate) }, mergedOrders: { ?? } } }
])

, который не находится рядом с действительным групповым вызовом группы.

Итак, как мне группировать заказы по диапазону данных ? (Мне нужно получить для каждого диапазона данных весь массив заказов в этом диапазоне данных, как они есть, без исключения полей)

Ответы [ 2 ]

1 голос
/ 08 февраля 2020

Вы можете попробовать это:

 db.sales.aggregate([
    { $match: { date: { "$gte": new Date(req.query.minDate), "$lte": new Date(req.query.maxDate) } } },
    {
        $group: {
            _id: {
                $month: {
                    $dateFromString: {
                        dateString: '$date',
                        format: "%d/%m/%Y"
                    }
                }
            }, mergedOrders: { $push: '$$ROOT' }
        }
    }, {
        $addFields: {
            _id: {
                $let: {
                    vars: {
                        monthsInString: ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec']
                    },
                    in: {
                        $arrayElemAt: ['$$monthsInString', '$_id']
                    }
                }
            }
        }
    }])

Тест: MongoDB-Playground

0 голосов
/ 08 февраля 2020

Вы можете использовать оператор $ group для группировки данных на основе определенного значения в поле. Тогда вы можете использовать оператор pu sh, чтобы получить массив этих значений.

db.sales.aggregate([
    $match: {
        date: { "$gte": new Date(req.query.minDate), "$lte": new Date(req.query.maxDate) }
    },
    $group : {
        _id: "$date",
        orders: {
            $push: {
                deleted: "$deleted",
                total: "$total"       
             }
        }
    },
    $project: {
      _id: 1,
    orders: 1
   }
)];
...