Mongo:投影后过滤

我正在使用 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转换为日期时间的值在哪里(已经工作)。现在,应该过滤文档列表,例如date2 >= isodate 我尝试通过实施来做到这一点:


'date2': { 

                '$filter': {

                    'input': {

                        '$dateFromString': {

                            'dateString': '$published_date',

                            }

                        },

                    'as': "date2",

                    'cond': { 

                        '$gte': ['$$date2', isodate] 

                        }

                    } 

                } 

但它似乎不起作用,因为我收到以下错误:


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


更新 正如评论中所问,数据由具有多个字段的文档组成,published_date是其中之一。我希望输出符合 . 过滤器的文档列表published_date >= datetime.now()。


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


有什么想法吗?


GCT1015
浏览 62回答 1
1回答

江户川乱折腾

忘记 $filter。它有不同的用途。您希望管道中有一个额外的 $match 阶段来过滤掉$project 阶段生成的文档:pipeline = [    {'$limit': 2},    {'$project': {         'date':'$published_date',        'date2': {            '$dateFromString': {                'dateString': '$published_date',                }            },        }    },    {'$match': {'date2': {'$gte': isodate}}}]假设你isodate是一个有效的日期对象。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python