查询字段值作为条件的一部分

Query with value of field as part of condition

我有这个简单的文档设置:

{
  lastFetched: 2021-03-01T09:27:07.406+00:00
  dateAdded:   "2020-12-19"
}

如何找到 lastFetched 小于 dateAdded 的文档?类似于:

db.collection.find( { lastFetched: {$lt: ISODate('$dateAdded')} } )

为此,我首先需要将 lastFetched 转换为日期字符串,或将 dateAdded 转换为 ISODate 对象。

但更重要的是:如何使用字段值作为条件检查的输入?一个更简单的版本是:

{
  lastFetched: "2021-03-01"
  dateAdded:   "2020-12-19"
}

使用以下伪查询:

db.collection.find( { lastFetched: {$lt: '$dateAdded'} } )

我已经尝试使用 $addFields(聚合)作为第一步:

{
  date: ISODate('$dateAdded')
}

但这只是给了我 1970-01-01T00:00:00.000+00:00 的日期。

非常欢迎任何帮助!

谢谢

感谢@Joe 的 $expr 提示。这是我自己未来版本的解决方案:

创建以下聚合阶段。第一阶段将 ISODate 字段 lastFetched 替换为与 dateAdded 格式匹配的字符串版本 (YYYY-MM-DD)。然后使用 $expr 检查该字段。

[
  {
    '$addFields': {
      'lastFetched': {
        '$dateToString': {
          'date': '$lastFetched', 
          'format': '%Y-%m-%d'
        }
      }
    }
  }, {
    '$match': {
      '$expr': {
        '$lt': [
          '$lastFetched', '$dateAdded'
        ]
      }
    }
  }
]

没有必要添加额外的 $addFields 阶段,在大多数情况下最好尽量减少阶段数。您可以在 $match 阶段转换为 ISODate in-line:

db.foo.aggregate([
    {'$match': {'$expr': {
        '$lt': [{'$dateToString':{'date':'$lastFetched','format':'%Y-%m-%d'}},
                '$dateAdded'
               ]
    }}}
]);