首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MongoDB查找在过去7天中创建的文档,并在未创建文档的日子返回0

MongoDB查找在过去7天中创建的文档,并在未创建文档的日子返回0
EN

Stack Overflow用户
提问于 2022-04-09 14:53:42
回答 1查看 49关注 0票数 0

我正试图在我的蒙古族数据库里找到过去7天的文件。

在返回特定日期和在给定日期上创建的numOfTickets的情况下,我能够以所需的格式接收数据:

代码语言:javascript
运行
复制
{
    "datesUsed": {
        "startDate": "2022-04-02T14:42:14.223Z",
        "endDate": "2022-04-09T14:42:14.223Z"
    },
    "data": [
        {
            "date": "02/04/2022",
            "numOfTickets": 1
        },
        {
            "date": "03/04/2022",
            "numOfTickets": 1
        },
        {
            "date": "04/04/2022",
            "numOfTickets": 2
        },
        {
            "date": "06/04/2022",
            "numOfTickets": 1
        },
        {
            "date": "07/04/2022",
            "numOfTickets": 1
        },
        {
            "date": "08/04/2022",
            "numOfTickets": 2
        },
        {
            "date": "09/04/2022",
            "numOfTickets": 1
        }
    ]
}

问题是,Mongo只在文档创建的日期返回数据,而在没有创建文档的日子(在本例中为05/04/2022 )则不返回任何数据。

我想要实现的是,还包括了另一个JSON对象,它可以这样说:

代码语言:javascript
运行
复制
{
            "date": "05/04/2022",
            "numOfTickets": 0
}

到目前为止,这就是我所拥有的:

代码语言:javascript
运行
复制
const companyId = req.query.companyId;
    let dates = [];
    const data = [];
    // Last 7 days
    const endDate = new Date();
    const startDate = new Date(Date.now() - 604800000);

    // Find tickets from past 7 days
    const allCompanyTickets = await ticketModel
      .find({
        company_id: companyId,
        createdAt: { $gte: new Date(startDate), $lte: new Date(endDate) },
      })
      .sort({ createdAt: 1 });

      console.log(allCompanyTickets)

    // Push them to an array
    allCompanyTickets.forEach((ticket) => {
      dates.push(ticket.createdAt.toLocaleDateString());
    });

    // Count occurences of days in the dates array
    function countOccurrences(arr) {
      return arr.reduce(function (a, b) {
        a[b] = a[b] + 1 || 1;
        return a;
      }, []);
    }

    // Make an object from the data above
    const datesOrdered = countOccurrences(dates);

    // Give the data above keys and push it to a new array
    for (let key in datesOrdered) {
      const tempObj = { date: key, numOfTickets: datesOrdered[key] };
      data.push(tempObj);
    }

    res.status(200).json({ datesUsed: { startDate, endDate }, data: data });
EN

回答 1

Stack Overflow用户

发布于 2022-04-09 21:16:52

就像这样

代码语言:javascript
运行
复制
db.ticketModel.aggregate([
  {
    $set: {
      datesUnused: {
        $range: [ 0, { $dateDiff: { startDate: "$startDate", endDate: "$endDate", unit: "day" } } ]
      }
    }
  },
  {
    $set: {
      datesUnused: {
        $map: {
          input: "$datesUnused",
          in: { 
            date: { 
               $dateAdd: { 
                  startDate: { $dateTrunc: { date: "$datesUsed.startDate", unit: "day" }, 
                  unit: "day", 
                  amount: "$$this" 
               } 
            },
            numOfTickets: 0
          }
        }
      }
    }
  },
  {
    $set: {
      data: {
        $filter: {
          input: "$datesUnused",
          cond: { $not: { $in: [ "$$this.date", "$data.date" ] } }
        }
      }
    }
  }
])

蒙戈游乐场

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71809140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档