02.08.2019     163

Примеры из видео

Две случайные записи:

[{
    $sample: {
        size: 2
    }
}]

Статистика по месяцам, общая цена и количество:

[{
    $group: {
        _id: {
            month: {
                $month: '$createdDate'
            }
        },
        totalPrice: {
            $sum: '$price'
        },
        total: {
            $sum: 1
        },
        emails: {
            $addToSet: '$email'
        }
    }
}]

Статистика заказов по дням одного месяца:

[{
    $match: {
        createdDate: {
            $gte: ISODate('2019-07'),
            $lt: ISODate('2019-08')
        }
    }
}, {
    $group: {
        _id: {
            day: {
                $dayOfMonth: '$createdDate'
            }
        },
        totalPrice: {
            $sum: '$price'
        },
        total: {
            $sum: 1
        },
        emails: {
            $addToSet: '$email'
        }
    }
}, {
    $sort: {
        '_id.day': 1
    }
}]

Изменение ключа:

[{
    $group: {
        _id: {
            month: {
                $month: '$createdDate'
            }
        },
        totalPrice: {
            $sum: '$price'
        },
        total: {
            $sum: 1
        },
        buyers: {
            $push: {
                status: '$status',
                email: '$email'
            }
        }
    }
}, {
    $project: {
        month: '$_id.month',
        total: 1,
        totalPrice: 1,
        buyers: 1
    }
}, {
    $project: {
        _id: 0
    }
}]

Статистика заказов с группировкой по ценам с границами с шагом 5000:

[{
    $bucket: {
        groupBy: '$price',
        boundaries: [0, 5000, 10000, 15000, 20000],
        default: 'Other',
        output: {
            count: {
                $sum: 1
            },
            ids: {
                $push: '$_id'
            }
        }
    }
}]

Число заказов для каждого статуса:

[{
    $group: {
        _id: {
            month: {
                $month: '$createdDate'
            }
        },
        statuses: {
            $push: '$status'
        },
        orders: {
            $push: {
                id: '$_id',
                status: '$status',
                date: '$createdDate'
            }
        }
    }
}, {
    $project: {
        statusNew: {
            $size: {
                $filter: {
                    input: '$statuses',
                    as: 's',
                    cond: {
                        $eq: ['$$s', 'Новый']
                    }
                }
            }
        },
        statusNewOrders: {
            $filter: {
                input: '$orders',
                as: 'o',
                cond: {
                    $eq: ['$$o.status', 'Новый']
                }
            }
        },
        statusSend: {
            $size: {
                $filter: {
                    input: '$statuses',
                    as: 's',
                    cond: {
                        $eq: ['$$s', 'Отправлен']
                    }
                }
            }
        },
        statusPaid: {
            $size: {
                $filter: {
                    input: '$statuses',
                    as: 's',
                    cond: {
                        $eq: ['$$s', 'Оплачен']
                    }
                }
            }
        },
    }
}]