如何根据日期范围mongoDB选择所有数据?

如何根据日期范围mongoDB选择所有数据?,mongodb,Mongodb,我有一个如下的记录列表 [ { "product": "p1", "salesdate": "2020-02-01", "amount": 100 }, { "product": "p2", "salesdate": "2020-02-04", "a

我有一个如下的记录列表

[
  {
    "product": "p1",
    "salesdate": "2020-02-01",
    "amount": 100
  },
  {
    "product": "p2",
    "salesdate": "2020-02-04",
    "amount": 200
  },
  
]
2月2日和2月3日我没有数据。但是我需要在我的结果中加上这个。我的预期结果是

[
  {
    "amount": 100,
    "salesdate": "2020-02-01"
  },
  {
    "amount": 0,
    "salesdate": "2020-02-02"
  },
  {
    "amount": 0,
    "salesdate": "2020-02-03"
  }
  {
    "amount": 200,
    "salesdate": "2020-02-04"
  }
]
我可以使用mongoDB实现这一点吗


您可以使用
$reduce
进行此操作。每当需要处理数据/时间值时,我推荐使用库。你不必使用它,但它让你的生活更轻松

db.collection.aggregate([
   // Put all data into one document
   { $group: { _id: null, data: { $push: "$$ROOT" } } },
   // Add missing days
   {
      $addFields: {
         data: {
            $reduce: {
               // Define the range of date
               input: { $range: [0, moment().get('day')] },
               initialValue: [],
               in: {
                  $let: {
                     vars: {
                        ts: {
                           $add: [moment().startOf('month').toDate(), { $multiply: ["$$this", 1000 * 60 * 60 * 24] }]
                        }
                     },
                     in: {
                        $concatArrays: [
                           "$$value",
                           [{
                              $ifNull: [
                                 { $first: { $filter: { input: "$data", cond: { $eq: ["$$this.salesdate", "$$ts"] } } } },
                                 // Default value for missing days
                                 { salesdate: "$$ts", amount: 0 }
                              ]
                           }]
                        ]
                     }
                  }
               }
            }
         }
      }
   },
   { $unwind: "$data" },
   { $replaceRoot: { newRoot: "$data" } }
   // If requried add further $group stages
])
注意,此代码返回从当前月份的第一天到当前天的值(与示例数据中的值不同)。您可以调整范围-您的要求不清楚


输入开始日期和结束日期。在这两个日期之间缺少任何日期我需要添加该日期,金额为0这是我的要求获取此错误无法分析查询内容:无效字符“.”在数组元素之后,您可能会有打字错误。调整范围应该不是什么挑战
moment().get('day')
是天数,即您必须计算输入值的差值。是否能够创建mongoplayground?已添加游乐场。注意,永远不要将日期/时间值存储为字符串,这是一个设计缺陷。像我在操场上做的那样,始终使用适当的
Date
对象。函数将帮助您。