pymongo: el nombre ‘ISODate’ no está definido

Tengo un problema cuando bash seleccionar datos en mongodb con pymongo, este es mi código:

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 

y cuando lo ejecuto tengo un error como este:

 Traceback (most recent call last): File "test.py", line 9, in  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 

Quiero el resultado como este:

 { "_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" } 

Esta es la estructura de ejemplo de mydatabase:

 > 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" } 

Por favor ayúdame a arreglar el error.

ISODate es una función en el shell Mongo, que es un entorno javascript, no está disponible dentro de Python.

Puede usar dateutil para convertir una cadena en un objeto datetime en 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()) 

Usando PyMongo , si desea insertar datetime en MongoDB , simplemente puede hacer lo siguiente:

 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}) 

ISODate es un objeto de fecha de JavaScript. Para consultar el rango de fechas usando PyMongo, debe usar una instancia de datetime.datetime que mongod convertirá al tipo de BSON apropiado. No necesitas ninguna biblioteca de terceros.

Además, no debe utilizar el Marco de agregación para hacer esto porque el campo _id es único dentro de la colección, lo que hace que este sea un trabajo perfecto para el método distinct() .

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

Si realmente necesita usar el método aggregate() , su etapa $match debe tener este aspecto:

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