芒果:投影后过滤

问题描述 投票:0回答:1

我正在和pymongo合作。我的其中一个字段是: published_date 是一个字符串,格式为 2020/03/10 07:20:09

我可以使用下面的集合将这个值转换为一个日期时间。

isodate = datetime.now()
pipeline = [
    {'$limit': 2},
    {'$project': { 
        'date':'$published_date',
        'date2': {
            '$dateFromString': {
                'dateString': '$published_date',
                }
            },
        }
    }
]
cursor = TEST_COLLECTION.aggregate(pipeline)
list(cursor)

其中 date2 是转换为datetime的值(已经在工作).现在,文档列表应该被过滤,如 date2 >= isodate我试着通过实现来实现它。

'date2': { 
                '$filter': {
                    'input': {
                        '$dateFromString': {
                            'dateString': '$published_date',
                            }
                        },
                    'as': "date2",
                    'cond': { 
                        '$gte': ['$$date2', isodate] 
                        }
                    } 
                } 

但似乎没有用,因为我得到了以下错误。

OperationFailure: $filter的输入必须是一个数组,而不是日期。

更新正如评论中所要求的那样,数据由具有若干字段的文件组成。published_date 是其中之一。我希望输出的是一个符合过滤器的 published_date >= datetime.now().

也许解决方案不是一个管道,但我不确定,因为这是我第一次与 aggregates.

有什么想法吗?

python mongodb pymongo
1个回答
2
投票

忘记$filter。它的作用不同。你希望在管道中多一个$match阶段来过滤掉以下内容 文件 阶段产生的。

pipeline = [
    {'$limit': 2},
    {'$project': { 
        'date':'$published_date',
        'date2': {
            '$dateFromString': {
                'dateString': '$published_date',
                }
            },
        }
    },
    {'$match': {'date2': {'$gte': isodate}}}
]

假设你的 isodate 是一个有效的日期对象。

© www.soinside.com 2019 - 2024. All rights reserved.