Node.js + Mongoose.js Как получить сумму заказов, размещенных за месяц или неделю?

Я выясняю общую структуру, но как получить документы за месяц или неделю? Я пытаюсь подсчитать, сколько заказов размещено за неделю или за месяц. Документы такие:

{
    "_id" : ObjectId("53834167b54a3b22f0079e2c"),
    "createdDate" : ISODate("2014-05-26T13:28:07.942Z"),
    "__v" : 0
},
{
    "_id" : ObjectId("53834167b54a3b22f0079e2c"),
    "createdDate" : ISODate("2014-05-28T09:28:07.942Z"),
    "__v" : 0
}

Все, что я хочу, - это сколько заказов размещается в месяц в соответствии с созданной датой.

Текущий код, который я использую:

Order.aggregate([
    { "$match": {
        'createdDate': {
            "$gte": new Date("2014-05-25"), "$lte": new Date("2014-05-27")
        }
    }},
    { "$group": {
        "_id": { "$dayOfYear": "$createdDate" },
        "totalCost": { "$sum": "$totalCost" },
        "sum": {"$sum": 1}
    }}
],
function(err, result) {
    console.log(result);
    if (err) {
        res.send(400, err);
    } else {
        res.send(200, result);
    }
});

1 ответ

Решение

Если вы просто хотите получить общее количество заказов за определенный период времени, вы можете просто использовать диапазонный запрос для вашей даты, используя $gte а также $lt операторы стиля:

var query = Model.find({ 
    "createdDate": { 
        "$gte": new Date("2014-05-21"), "$lte": new Date("2014-05-29")
    }
}).count()

query.exec(function(err, count) {

И это просто вернет счет, если документы найдены в этом диапазоне.

Если вы хотите суммировать значение из своего документа или даже получить что-то вроде "ежедневных итогов" из этого диапазона дат, то вы можете использовать структуру агрегации, чтобы сделать это:

Model.aggregate([
    { "$match": {
        "$gte": new Date("2014-05-21"), "$lte": new Date("2014-05-29")
    }},
    { "$group": {
        "_id": { "$dayOfYear": "$createdDate" }
        "totalValue": { "$sum": "$orderTotal" }
    }}
],
function(err, result) {

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

Если вам нужен последний случай, вы можете использовать различные операторы там, чтобы разбить различные периоды дат, которые вы хотите включить в свои результаты.

Другие вопросы по тегам