MongoDB查询嵌套布尔值是否为真

时间:2017-03-19 19:50:18

标签: mongodb mongoose mongodb-query aggregation-framework

我有一个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日,我如何查询它是否出现在每年的每个星期五?

这就是我所拥有的,现在我有点迷失了。 (使用时刻和猫鼬)

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(),

任何帮助将不胜感激:)

1 个答案:

答案 0 :(得分: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()