mongodb $或总是返回false(const)

时间:2018-11-27 05:50:13

标签: mongodb mongoose mongodb-query aggregation-framework

我创建了一个聚合管道来检索文档并添加一个新字段“ expired”(布尔值),其值基于字段“ expireAt”(日期)

如果满足以下条件,则过期字段被视为真

  • expiredAt丢失,或者为null或为空
  • expiredAt <现在

这是我的审判

{project:
expired: {
          $not: {
            $or: [{ expireAt: null }, { $gte: ['$expireAt', new Date()] }]
          }
        }
}

即使文档具有expireAt值,此代码也总是给我错误,现在是

通过执行解释:

{ '$project': { _id: true, expireAt: true, expired: { '$cons
    t': false } } }

查询结果:

  • 请注意expireAt字段和相应的过期值
  • 今天是:27/11/2018

    {已过期:false}, {expireAt:2019-07-15T17:18:11.000Z,expired:false}, {expireAt:2017-07-16T17:18:11.000Z,过期:false},

还{expireAt:{$ exists:false}}给出错误: MongoError:在queryCallback上无法识别的表达式'$ exists'

任何检查字段是否存在的想法(天气值是否为空)

2 个答案:

答案 0 :(得分:0)

  

使用$cond运算符来实现

以下查询可帮助您:

  

我在字段中使用了date

db.getCollection('chat').aggregate([
  {
    $project: {
      'date': 1,
      "expired": {
        $cond: {
          if: { $gte: ['$date', new Date()] },
          then: false,
          else: true
        }
      }
    }
  }
])

使用$or

db.getCollection('chat').aggregate(
   [
     {
       $project:
          {
            date: 1,
            expired: { $or: [ { $lt: [ "$date", new Date() ] }, { $eq: [ "$date", null ] } ] }
          }
     }
   ]
)

答案 1 :(得分:0)

以下代码与我合作:

expired:{
$and: ['$expireAt', { $lt: ['$expireAt', new Date()] }]
}