【问题标题】:MongoDB create empty results objectMongoDB 创建空结果对象
【发布时间】:2023-03-10 13:09:01
【问题描述】:

我的数据库 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


【解决方案1】:

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

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 天,并且循环比这个查询快,

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

【讨论】:

  • 嗨@turivishal,你能告诉我为什么查询是一个较慢的选项吗?
  • @Ibrahim 逐步查看管道,最后 5 个管道仅用于创建此输出,我们知道只有准确的 7 条记录将是最终文档,因此循环比这 5 个管道更快。跨度>
  • @HảiTrungPhạm 你用这个答案解决了你的问题吗?有什么问题让我知道会尽力解决的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
  • 2014-05-15
  • 1970-01-01
  • 2019-09-11
  • 1970-01-01
  • 1970-01-01
  • 2020-03-03
相关资源
最近更新 更多