首页 > 解决方案 > MongoDB 创建空结果对象

问题描述

我的数据库 Mongo 中有一个这样的集合:

/*Order:*/

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

这是我的代码 Mongo,用于获取从 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
}

标签: mongodb

解决方案


您需要将预定义的空值数组存储在变量中,

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} ]

聚合查询:Playground ,

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"
    }
  }
])

注意:当您使用聚合查询时,这是一个非常漫长的过程,并且会降低查询的性能,我说的是特别需要的结果,

我的建议是使用循环在查询之外进行,因为一周中只有可数的 7 天,并且循环比这个查询快,

我没有在这里添加循环示例,因为我不确定您使用的是哪种语言。


推荐阅读