【问题标题】:pymongo: name 'ISODate' is not definedpymongo:未定义名称“ISODate”
【发布时间】:2017-09-29 13:43:09
【问题描述】:

当我尝试使用 pymongo 在 mongodb 中选择数据时遇到问题,这是我的代码:

import pymongo
from pymongo import MongoClient
import sys
from datetime import datetime

try:
    conn=pymongo.MongoClient('10.33.109.228',27017)
    db=conn.mnemosyne
    data_ip=db.session.aggregate({'$match':{'timestamp':{'$gte': ISODate('2016-11-11T00:00:00.000Z'),'$lte': ISODate('2016-11-11T23:59:59.000Z')}}},{'$group':{'_id':'$source_ip'}})
    for f in data_ip:
        print f['_id']

except pymongo.errors.ConnectionFailure, e:
    print "Could not connect to MongoDB: %s" % e

当我执行它时,我有一些像这样的错误:

Traceback (most recent call last):
  File "test.py", line 9, in <module>
    data_ip=db.session.aggregate({'$match':{'timestamp':{'$gte': ISODate('2016-11-11T00:00:00.000Z'),'$lte': ISODate('2016-11-11T23:59:59.000Z')}}},{'$group':{'_id':'$source_ip'}})
NameError: name 'ISODate' is not defined

我想要这样的结果:

{ "_id" : "60.18.133.207" }
{ "_id" : "178.254.52.96" }
{ "_id" : "42.229.218.192" }
{ "_id" : "92.82.171.117" }
{ "_id" : "103.208.120.205" }
{ "_id" : "185.153.208.142" }

这是我的数据库的示例结构:

> db.session.findOne()

    {
            "_id" : ObjectId("5786398d1f50070f31f27f7c"),
            "protocol" : "epmapper",
            "hpfeed_id" : ObjectId("5786398d1f50070f31f27f7b"),
            "timestamp" : ISODate("2016-07-13T12:52:29.112Z"),
            "source_ip" : "23.251.55.182",
            "source_port" : 2713,
            "destination_port" : 135,
            "identifier" : "d3374f14-48f7-11e6-9e19-0050569163b4",
            "honeypot" : "dionaea"
    }

请帮我修复错误

【问题讨论】:

    标签: python mongodb mongodb-query pymongo


    【解决方案1】:

    ISODate 是 Mongo shell 中的一个函数,它是一个 javascript 环境,它在 Python 中不可用。

    您可以使用dateutil 在 Python 中将字符串转换为日期时间对象,

    import dateutil.parser
    dateStr = "2016-11-11T00:00:00.000Z"
    dateutil.parser.parse(dateStr)  # returns a datetime.datetime(2016, 11, 11, 00, 0, tzinfo=tzutc())
    

    使用PyMongo,如果您想在MongoDB 中插入日期时间,您只需执行以下操作:

    import pymongo
    import dateutil
    dateStr = '2016-11-11T00:00:00.000Z'
    myDatetime = dateutil.parser.parse(dateStr)
    client = pymongo.MongoClient()
    client.db.collection.insert({'date': myDatetime})
    

    【讨论】:

      【解决方案2】:

      ISODate 是一个 JavaScript 日期对象。要使用 PyMongo 查询日期范围,您需要使用 datetime.datetime 实例,mongod 会将其转换为适当的 BSON 类型。您不需要任何第三方库。

      此外,您不应该使用聚合框架来执行此操作,因为 _id 字段在集合中是唯一的,这使其成为 distinct() 方法的完美工作。

      import datetime
      
      
      start = datetime.datetime(2016, 11, 11)
      end = datetime(2016, 11, 11, 23, 59, 59)
      
      db.session.distinct('_id', {'timestamp': {'$gte': start, '$lte': end}})
      

      如果你真的需要使用aggregate() 方法,你的$match 阶段必须是这样的:

      {'$match': {'timestamp': {'$gte': start, '$lte': end}}}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-09
        • 2011-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-23
        相关资源
        最近更新 更多