MongoDB find()-尝试构造一个复杂的日期查询

时间:2019-02-16 19:41:41

标签: mongodb date mongodb-query

我正在尝试编写一个相当复杂的MongoDB查询,该查询返回仅针对未来事件过滤的一组结果(事件)。

不幸的是,这些事件的数据模式有些令人沮丧。用户可以设置一个具有特定结束日期的事件(可以使用此功能),也可以选择在特定日期结束的重复发生(也可以)。

但是,他们还可以选择该事件的选项,使其每隔X天/周/月重复一次(有一个类型字段,可以选择其中的哪一个),以进行总计Y次重复。因此,如果要计算有效的结束日期,则需要在查询中使用所有这三个变量。

我正在努力处理MongoDB查询中的日期的语法,使用数据库中的数据来构造新的日期对象...

这是我到目前为止构造的条件,我正在尝试完成包含/ * * /注释的3行。

如果有人知道这样做的方法,我将非常感谢您的帮助。谢谢!

$or: [
    { 'when.endingDate': { $gte: new Date() } },
    { 'when.recurring.forever': { $eq: true } },
    { 'when.multipleDays': { $eq: true } },
    {
      $and: [
        { 'when.recurring.occurences': { $gte: 1 } },
        { $or: [
          { $and: [
            { 'when.recurring.type': { $eq: 'day' } },
            { /* when.endingDate + when.recurring.occurences * when.recurring.every * days >= new Date() */ }
          ] },
          {
            $and: [
              { 'when.recurring.type': { $eq: 'week' } },
              { /* when.endingDate + when.recurring.occurences * when.recurring.every * week >= new Date() */ }
            ]
          },
          {
            $and: [
              { 'when.recurring.type': { $eq: 'month' } },
              { /* when.endingDate + when.recurring.occurences X when.recurring.every * month >= new Date() */ }
            ]
          }
        ] }
      ]
    },
    { $and: [
      { 'when.repeat': { $eq: true } },
      { 'when.recurring.until': { $gte: new Date() } }
    ] }
  ]

1 个答案:

答案 0 :(得分:0)

您正在尝试将大量业务逻辑塞入mongodb查询中。

我将选择以下方法之一:

  • 将数据库流式传输到应用程序,并以实际的编程语言(首选)运行上述逻辑;
  • 为上述查询准备数据。设置帮助者字段,并通过计划的作业定期更新它们。