【问题标题】:Query with value of field as part of condition使用字段值作为条件的一部分进行查询
【发布时间】:2022-01-29 03:10:26
【问题描述】:

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

  • dateAdded: 日期格式为 'YYYY-MM-DD' 的字符串
  • lastFetched: 日期对象(ISODate mongodb 语言)
{
  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的日期。

非常欢迎任何帮助!

谢谢

【问题讨论】:

标签: node.js mongodb mongodb-query


【解决方案1】:

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

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

【讨论】:

  • 太棒了!感谢您的提示!
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2010-12-11
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 2013-03-06
    • 2014-04-14
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    相关资源
    最近更新 更多