如何在mongodb中过滤命令游标

时间:2018-12-02 11:03:52

标签: mongodb pymongo

我对NoSQL数据库还很陌生。我遇到一个简单的问题

我有一个日期为字符串的数据库。我想过滤我的集合,以便可以获取日期大于特定日期的元素。为了解决该问题,我将字符串日期转换为日期对象,并使用聚合$ addFields方法将其添加为字段。

collection.aggregate([{
"$addFields": {
  "CA": {
    "$convert": {
      "input": {
        "$substr": ["$headers.Date", 5, 20]
      },
      "to": "date"
    }
  }
}}])

我首先尝试了上面的代码,它可以工作。有带有日期对象的“ CA”字段,但我想使用查找和过滤器对其进行过滤,但是由于它是命令游标,因此方法不可用。这就是为什么我尝试下面的代码,但也无法正常工作的原因。它基本上是代码的修改版本,上面添加了$ filter

collection.aggregate([{
  "$filter": {
     "input": {
        "$addFields": {
           "CA": {
              "$convert": {
                 "input": {
                    "$substr": ["$headers.Date", 5, 20]
                 },
                 #"$headers.Date"
                 "to": "date"
              }
           }
        }
     },
     'as': 'db',
     "cond": {
        "$lt": ["$db.CA", datetime.now()]
     }
  }}])

编辑:根据要求,我在下面添加了示例元素

{'_id': ObjectId('e27'),
 'body': "Body",
 'subFolder': 'notes_inbox',
 'mailbox': 'bass-e',
 'filename': '450.',
 'headers': {'X-cc': '',
  'From': 'XXX@XX.com',
  'Subject': 'Re: information',
  'X-Folder': '\\Notes inbox',
  'Content-Transfer-Encoding': '7bit',
  'X-bcc': '',
  'To': 'x.bass@y.com',
  'X-Origin': 'Bass-E',
  'X-FileName': 'ebass.nsf',
  'X-From': 'Miel Sim',
  'Date': 'Tue, 14 Nov 2000 08:22:00 -0800 (PST)',
  'X-To': 'Eric Bass',
  'Message-ID': '<6884142.1075854677416.JavaMail.evans@thyme>',
  'Content-Type': 'text/plain; charset=us-ascii',
  'Mime-Version': '1.0'}}

1 个答案:

答案 0 :(得分:1)

当您需要过滤嵌套数组时,可以使用$filter,在这种情况下,由于只有一个值,您可以简单地使用$match,请尝试:

db.collection.aggregate([
    {
        "$addFields": {
            "CA": {
                "$convert": {
                "input": {
                    "$substr": ["$headers.Date", 5, 20]
                },
                    "to": "date"
                }
            }
        }
    },
    {
        $match: {
            CA: { $lt: ISODate() } // or datetime.now()
        }
    }
])

如果您不想添加新字段,则可以使用$expr运算符:

db.collection.aggregate([
    {
        $match: {
            $expr: {
                $lt: [ { $convert: { input: { "$substr": ["$headers.Date", 5, 20] }, to: "date" } }, ISODate() ]
            }
        }
    }
])
相关问题