检查匹配查询聚合mongodb中是否存在字段

Gho*_*ost 2 match mongodb aggregation-framework

我有一个 mongodb 事件集合,我想从中获取当前可用事件,所以我正在使用这样的匹配查询

   Event.aggregate([ { $match: { isActive: true, ...matchQuery, startDate:{$lt:today}, endDate:{$gt:today} } },])
Run Code Online (Sandbox Code Playgroud)

问题是,并非我的数据库中的所有事件都有 startDate 和 enDate 字段,我也想获取这些事件,所以我想检查 startDate 和 endDate 是否存在,那么如果它们不存在,它们应该比今天的 lt 和 gt并且该文档与查询的其余部分匹配,我想获取它。我尝试了这种方法,但不起作用

{ $match: { isEnabled: true, ...matchQuery, startDate ? {startDate:{$lt:today}}, endDate ?  endDate:{$gt:today} } },
  
Run Code Online (Sandbox Code Playgroud)

谢谢

Pur*_*jax 7

所以我们的想法是获取所有文档:

  1. startDate AND endDate不退出。

或者

  1. today位于范围startDate AND endDate之间。

尝试这个:

let today = new Date();

db.events.aggregate([
    {
        $match: {
            isActive: true,
            $or: [
                {
                    startDate: { $exists: false },
                    endDate: { $exists: false }
                },
                {
                    startDate: { $lt: today },
                    endDate: { $gt: today }
                }
            ]
        }
    }
])
Run Code Online (Sandbox Code Playgroud)

输出:

{
    "_id" : ObjectId("..."),
    "isActive" : true,
    "startDate" : ISODate("2021-03-01T00:00:00.000+05:30"),
    "endDate" : ISODate("2021-03-31T00:00:00.000+05:30")
},
{
    "_id" : ObjectId("..."),
    "isActive" : true
}
Run Code Online (Sandbox Code Playgroud)

测试数据:

{
    "_id" : ObjectId("..."),
    "isActive" : true,
    "startDate" : ISODate("2021-03-01T00:00:00.000+05:30"),
    "endDate" : ISODate("2021-03-31T00:00:00.000+05:30")
},
{
    "_id" : ObjectId("..."),
    "isActive" : true,
    "endDate" : ISODate("2021-03-31T00:00:00.000+05:30")
},
{
    "_id" : ObjectId("..."),
    "isActive" : true,
    "startDate" : ISODate("2021-03-01T00:00:00.000+05:30")
},
{
    "_id" : ObjectId("..."),
    "isActive" : true
},
{
    "_id" : ObjectId("..."),
    "isActive" : true,
    "startDate" : ISODate("2021-02-01T00:00:00.000+05:30"),
    "endDate" : ISODate("2021-03-03T00:00:00.000+05:30")
}
Run Code Online (Sandbox Code Playgroud)