MongoDB создает пустой объект результатов - PullRequest
0 голосов
/ 06 августа 2020

У меня есть такая коллекция в моей базе данных Mon go:

/*Order:*/

{
date_order: ISODate("2020-08-02T22:00:00.000Z"),
item: 'banana'
price: '2$'
}

Вот мой код Mon go, чтобы получать общее количество заказов за каждый день за неделю с 27/07 (понедельник) по 02/08 (воскресенье):

db.getCollection('order').aggregate([
    {$match: { date_order: {$gte: new Date('2020-07-27T22:00:00Z') , $lt: ISODate("2020-08-02T23:59:59Z")}}},
    {$group: {
        _id: {$dayOfWeek: '$date_order'},
        nbOfOrders: {$sum: 1}
    }},
    { $project: {
        '_id': 0,
        'dayOfWeek': { $subtract: ['$_id', 1] },
        'nbOfOrders': '$nbOfOrders'
        }
    }
])

Это дает мне результаты:

/* 1 */
{
    "dayOfWeek" : 0.0, // 0 for MONDAY
    "nbOfOrders" : 4.0
}

/* 2 */
{
    "dayOfWeek" : 4.0, // 4 for FRIDAY
    "nbOfOrders" : 4.0
}

Все остальные дни, кроме понедельника и пятницы, никто ничего не заказывает. Как мне записывать те дни без заказов? Я хочу получить такой результат:

/* MONDAY */
{
    "dayOfWeek" : 0.0,
    "nbOfOrders" : 4.0
}

/* TUESDAY */
{
    "dayOfWeek" : 1.0,
    "nbOfOrders" : 0.0
}

/* WEDNESDAY */
{
    "dayOfWeek" : 2.0,
    "nbOfOrders" : 0.0
}

/* THURSDAY */
{
    "dayOfWeek" : 3.0,
    "nbOfOrders" : 0.0
}

/* FRIDAY */
{
    "dayOfWeek" : 4.0,
    "nbOfOrders" : 4.0
}

/* SATURDAY */
{
    "dayOfWeek" : 5.0,
    "nbOfOrders" : 0.0
}

/* SUNDAY */
{
    "dayOfWeek" : 6.0,
    "nbOfOrders" : 0.0
}

1 Ответ

1 голос
/ 06 августа 2020

Вам необходимо сохранить предопределенный массив пустых значений в переменной,

let dayOfWeek = [ 
    {"dayOfWeek": 0, "nbOfOrders": 0},
    {"dayOfWeek": 1, "nbOfOrders": 0},
    {"dayOfWeek": 2, "nbOfOrders": 0},
    {"dayOfWeek": 3, "nbOfOrders": 0},
    {"dayOfWeek": 4, "nbOfOrders": 0},
    {"dayOfWeek": 5, "nbOfOrders": 0},
    {"dayOfWeek": 6, "nbOfOrders": 0} ]

Агрегационный запрос: Площадка ,

db.collection.aggregate([
  {
    $match: {
      date_order: {
        $gte: ISODate("2020-07-27T22:00:00Z"),
        $lt: ISODate("2020-08-10T23:59:59Z")
      }
    }
  },
  {
    $group: {
      _id: { $dayOfWeek: "$date_order" },
      nbOfOrders: { $sum: 1 }
    }
  },
  {
    $project: {
      _id: 0,
      dayOfWeek: {
        $subtract: ["$_id", 1]
      },
      nbOfOrders: "$nbOfOrders"
    }
  },
  {
    $group: {
      _id: null,
      items: { $push: "$$ROOT" }
    }
  },
  {
    $addFields: {
      items: {
        "$concatArrays": ["$items", dayOfWeek]
      }
    }
  },
  { $unwind: "$items" },
  {
    $group: {
      _id: "$items.dayOfWeek",
      nbOfOrders: { $sum: "$items.nbOfOrders" }
    }
  },
  {
    $project: {
      _id: 0,
      dayOfWeek: "$_id",
      nbOfOrders: "$nbOfOrders"
    }
  }
])

Примечание: Когда вы выполняете запрос агрегирования, это очень длительный процесс и снижает производительность вашего запроса, я говорю о В частности, этот требуемый результат,

, я предлагаю сделать это вне запроса, используя l oop, потому что есть только счетные 7 дней недели, а l oop быстрее, чем этот запрос,

Я не добавляю сюда l oop примеров, потому что я не уверен, какой язык вы используете.

...