tutorial instalar docs consultas avanzadas python mongodb datetime mongodb-query pymongo

instalar - mongodb y python



Consulta Mongodb en un mes, día, año... de una fecha y hora (7)

¿Qué hay de guardar el mes en su propiedad ya que necesita consultarlo? menos elegante que $where , pero es probable que tenga un mejor rendimiento, ya que se puede indexar.

Esta pregunta ya tiene una respuesta aquí:

Estoy usando mongodb y almaceno fecha y hora en mi base de datos de esta manera

para una fecha "17-11-2011 18:00" Guardo:

date = datetime.datetime(2011, 11, 17, 18, 0) db.mydatabase.mycollection.insert({"date" : date})

Me gustaría hacer una solicitud así

month = 11 db.mydatabase.mycollection.find({"date.month" : month})

o

day = 17 db.mydatabase.mycollection.find({"date.day" : day})

Alguien sabe cómo hacer esta consulta?


Las fechas se almacenan en su formato de marca de tiempo. Si quieres todo lo que pertenece a un mes específico, consulta para el inicio y el final del mes.

var start = new Date(2010, 11, 1); var end = new Date(2010, 11, 30); db.posts.find({created_on: {$gte: start, $lt: end}}); //taken from http://cookbook.mongodb.org/patterns/date_range/


No puede consultar directamente las colecciones de mongodb por componentes de fecha como día o mes. Pero es posible mediante el uso de la expresión especial $ where javascript

db.mydatabase.mycollection.find({$where : function() { return this.date.getMonth() == 11} })

o simplemente

db.mydatabase.mycollection.find({$where : ''return this.date.getMonth() == 11''})

(Pero prefiero el primero)

Consulte los comandos de la shell a continuación para obtener las partes de la fecha

>date = ISODate("2011-09-25T10:12:34Z") > date.getYear() 111 > date.getMonth() 8 > date.getdate() 25

EDITAR:

Use $ donde solo si no tiene otra opción. Viene con los problemas de rendimiento. Por favor, echa un vistazo a los comentarios a continuación por @kamaradclimber y @dcrosta. Dejaré esta publicación abierta para que los demás puedan conocerla.

y revisa el enlace $ where Cláusulas y funciones en Consultas para más información


Podría ejecutar una operación agregada con la función aggregate() que toma una canalización $redact que usa los Operadores de agregación de fechas en la expresión de condición:

var month = 11; db.collection.aggregate([ { "$redact": { "$cond": [ { "$eq": [ { "$month": "$createdAt" }, month ] }, "$$KEEP", "$$PRUNE" ] } } ])

Para la otra solicitud

var day = 17; db.collection.aggregate([ { "$redact": { "$cond": [ { "$eq": [ { "$dayOfMonth": "$createdAt" }, day ] }, "$$KEEP", "$$PRUNE" ] } } ])

Usando OR

var month = 11, day = 17; db.collection.aggregate([ { "$redact": { "$cond": [ { "$or": [ { "$eq": [ { "$month": "$createdAt" }, month ] }, { "$eq": [ { "$dayOfMonth": "$createdAt" }, day ] } ] }, "$$KEEP", "$$PRUNE" ] } } ])

Usando AND

var month = 11, day = 17; db.collection.aggregate([ { "$redact": { "$cond": [ { "$and": [ { "$eq": [ { "$month": "$createdAt" }, month ] }, { "$eq": [ { "$dayOfMonth": "$createdAt" }, day ] } ] }, "$$KEEP", "$$PRUNE" ] } } ])

El operador $redact incorpora la funcionalidad de $project y $match pipeline y devolverá todos los documentos que coincidan con la condición utilizando $$KEEP y descartará de la canalización aquellos que no coincidan con la variable $$PRUNE .


Puede encontrar el registro por mes, día, año, etc. de las fechas por Operadores de Agregación de Fecha , como $ dayOfYear, $ dayOfWeek, $ month, $ year, etc.

Como ejemplo, si desea todos los pedidos que se crean en abril de 2016, puede usar la consulta siguiente.

db.getCollection(''orders'').aggregate( [ { $project: { doc: "$$ROOT", year: { $year: "$created" }, month: { $month: "$created" }, day: { $dayOfMonth: "$created" } } }, { $match : { "month" : 4, "year": 2016 } } ] )

Aquí se creó un campo de tipo de fecha en los documentos, y $$ ROOT usamos para pasar el resto del campo para proyectar en la siguiente etapa, y darnos todos los detalles de los documentos.

Puede optimizar la consulta anterior según su necesidad, es solo para dar un ejemplo. Para saber más sobre los Operadores de agregación de fechas, visite el enlace .


Puede usar el contenedor MongoDB_DataObject para realizar dicha consulta como se muestra a continuación:

$model = new MongoDB_DataObject(''orders''); $model->whereAdd(''MONTH(created) = 4 AND YEAR(created) = 2016''); $model->find(); while ($model->fetch()) { var_dump($model); }

O, de manera similar, utilizando cadena de consulta directa:

$model = new MongoDB_DataObject(); $model->query(''SELECT * FROM orders WHERE MONTH(created) = 4 AND YEAR(created) = 2016''); while ($model->fetch()) { var_dump($model); }


Si desea buscar documentos que pertenecen a un mes específico, asegúrese de hacer una consulta como esta:

// Anything greater than this month and less than the next month db.posts.find({created_on: {$gte: new Date(2015, 6, 1), $lt: new Date(2015, 7, 1)}});

Evite hacer búsquedas como abajo tanto como sea posible.

// This may not find document with date as the last date of the month db.posts.find({created_on: {$gte: new Date(2015, 6, 1), $lt: new Date(2015, 6, 30)}}); // don''t do this too db.posts.find({created_on: {$gte: new Date(2015, 6, 1), $lte: new Date(2015, 6, 30)}});