【问题标题】:MongoDB Query if nested boolean is trueMongoDB查询嵌套布尔值是否为真
【发布时间】:2017-08-11 00:19:32
【问题描述】:

我有一个 MongoDB Mongoose 事件架构,部分看起来像这样。

...
  details: {
    startDate: String,
    endDate: String,
    startTime: Number,
    endTime: Number,
    days: {
      monday: Boolean,
      tuesday: Boolean,
      wednesday: Boolean,
      thursday: Boolean,
      friday: Boolean,
      saturday: Boolean,
      sunday: Boolean,
    },
  },
...

我需要查询当天发生的事件,即开始日期为当天的事件,或者开始日期为过去日期,结束日期为未来日期的事件,以及工作日在那个特定的日子里是真的。 比如一个Happy Friday活动,每周五举行一次,开始日期是2017年1月1日,结束日期是2017年12月31日,我如何查询它在一年中的每个星期五出现?

这就是我所拥有的,我现在有点迷失了。 (使用 moment 和 Mongoose)

const todayDateISO = moment().startOf('d').add(1, 'd').toISOString();
const todayDay = moment().startOf('d').add(1, 'd').format('dddd');

Event.find({
  $or: [
    { 'details.startDate': todayDateISO },
    {
      $and: [
        {
          $and: [
            { 'details.startDate': { $lte: todayDateISO } },
            { 'details.endDate': { $gte: todayDateISO } },
          ],
        },
        {
          // details.days.[day] is true
        }
      ]
    },
  ],
}).sort({ 'profile.startTime': 1 }).exec(),

任何帮助将不胜感激:)

【问题讨论】:

  • startDate 和 endDate (YYYY-MM-DD / DD-MM-YYYY) 的格式是什么?它们应该是Date 类型
  • @BertrandMartel graphQL 没有日期类型,这是我用来查询的,所以我将它们保存为 ISO 字符串,例如 new Date().toISOString()

标签: mongodb mongoose mongodb-query aggregation-framework


【解决方案1】:

您可以将架构更新为仅将天数存储为数组

类似days: [String] 的值days:["Friday", "Monday"] 并尝试以下查询。

Event.find({
  $or: [
    { 'details.startDate': todayDateISO },   
    {  $and:
        [ 
           { 'details.startDate': { $lte: todayDateISO } },
           { 'details.endDate': { $gte: todayDateISO } },
           { 'details.days': todayDay  }
        ] 
    }
  ]
}).sort({ 'profile.startTime': 1 }).exec()

【讨论】:

    猜你喜欢
    • 2011-02-19
    • 2018-04-28
    • 2019-08-07
    • 2018-08-13
    • 2021-12-23
    • 2021-12-04
    • 1970-01-01
    • 2012-08-18
    • 2022-07-31
    相关资源
    最近更新 更多