查询字段值作为条件的一部分
Query with value of field as part of condition
我有这个简单的文档设置:
dateAdded
:日期格式为 'YYYY-MM-DD' 的字符串
lastFetched
:日期对象(mongodb 语言中的ISODate
)
{
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'
]
}}}
]);
我有这个简单的文档设置:
dateAdded
:日期格式为 'YYYY-MM-DD' 的字符串
lastFetched
:日期对象(mongodb 语言中的ISODate
)
{
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'
]
}}}
]);