Overview
En esta guía, puedes aprender cómo especificar una query utilizando PyMongo.
Puede refinar el conjunto de documentos que devuelve una consulta creando un filtro de consulta. Un filtro de consulta es una expresión que especifica los criterios de búsqueda que MongoDB utiliza para encontrar documentos en una operación de lectura o escritura. En un filtro de consulta, puede solicitar al controlador que busque documentos que coincidan exactamente con su consulta o crear filtros de consulta para expresar criterios de coincidencia más complejos.
Datos de muestra
Los ejemplos de esta guía ejecutan operaciones en una colección llamada
fruits que contiene los siguientes documentos:
{ "_id": 1, "name": "apples", "qty": 5, "rating": 3, "color": "red", "type": ["fuji", "honeycrisp"] }, { "_id": 2, "name": "bananas", "qty": 7, "rating": 4, "color": "yellow", "type": ["cavendish"] }, { "_id": 3, "name": "oranges", "qty": 6, "rating": 2, "type": ["naval", "mandarin"] }, { "_id": 4, "name": "pineapple", "qty": 3, "rating": 5, "color": "yellow" },
El siguiente ejemplo de código muestra cómo crear una base de datos y una colección, y luego insertar los documentos de muestra en la colección. Seleccione el Synchronous o pestaña Asynchronous para ver el código correspondiente:
from pymongo import MongoClient uri = "<connection string URI>" client = MongoClient(uri) try: database = client["sample_fruit"] collection = database["fruits"] collection.insert_many([ { "_id": 1, "name": "apples", "qty": 5, "rating": 3, "color": "red", "type": ["fuji", "honeycrisp"] }, { "_id": 2, "name": "bananas", "qty": 7, "rating": 4, "color": "yellow", "type": ["cavendish"] }, { "_id": 3, "name": "oranges", "qty": 6, "rating": 2, "type": ["naval", "mandarin"] }, { "_id": 4, "name": "pineapple", "qty": 3, "rating": 5, "color": "yellow" }, ]) client.close() except Exception as e: raise Exception("Error inserting documents: ", e)
from pymongo import AsyncMongoClient uri = "<connection string URI>" client = AsyncMongoClient(uri) try: database = client["sample_fruit"] collection = database["fruits"] await collection.insert_many([ { "_id": 1, "name": "apples", "qty": 5, "rating": 3, "color": "red", "type": ["fuji", "honeycrisp"] }, { "_id": 2, "name": "bananas", "qty": 7, "rating": 4, "color": "yellow", "type": ["cavendish"] }, { "_id": 3, "name": "oranges", "qty": 6, "rating": 2, "type": ["naval", "mandarin"] }, { "_id": 4, "name": "pineapple", "qty": 3, "rating": 5, "color": "yellow" }, ]) await client.close() except Exception as e: raise Exception("Error inserting documents: ", e)
Coincidencia exacta
Las consultas de valor literal devuelven documentos que coinciden exactamente con su filtro de consulta.
El siguiente ejemplo especifica un filtro de query como un parámetro para el método find(). El código devuelve todos los documentos con un campo color con el valor de "yellow":
results = collection.find({ "color": "yellow" })
{'_id': 2, 'name': 'bananas', 'qty': 7, 'rating': 4, 'color': 'yellow', 'type': ['cavendish']} {'_id': 4, 'name': 'pineapple', 'qty': 3, 'rating': 5, 'color': 'yellow'}
Tip
Encuentre todos los documentos
Para encontrar todos los documentos de una colección, llame al método find() y pásele un filtro de consulta vacío. El siguiente ejemplo busca todos los documentos de una colección:
results = collection.find({})
Operadores de comparación
Los operadores de comparación evalúan el valor de un campo de documento con respecto a un valor especificado en el filtro de consulta. A continuación, se muestra una lista de operadores de comparación comunes:
$gt: Mayor que$lte:Menor o igual que$ne:No es igual
Para ver una lista completa de operadores de comparación, consulte la Guía de operadores de consultade comparación en el manual del servidor MongoDB.
El siguiente ejemplo especifica un operador de comparación en un filtro de consulta como parámetro del método find(). El código devuelve todos los documentos con un valor de campo rating mayor que 2:
results = collection.find({ "rating": { "$gt" : 2 }}) for f in results: print(f)
{'_id': 1, 'name': 'apples', 'qty': 5, 'rating': 3, 'color': 'red', 'type': ['fuji', 'honeycrisp']} {'_id': 2, 'name': 'bananas', 'qty': 7, 'rating': 4, 'color': 'yellow', 'type': ['cavendish']} {'_id': 4, 'name': 'pineapple', 'qty': 3, 'rating': 5, 'color': 'yellow'}
results = collection.find({ "rating": { "$gt" : 2 }}) async for f in results: print(f)
{'_id': 1, 'name': 'apples', 'qty': 5, 'rating': 3, 'color': 'red', 'type': ['fuji', 'honeycrisp']} {'_id': 2, 'name': 'bananas', 'qty': 7, 'rating': 4, 'color': 'yellow', 'type': ['cavendish']} {'_id': 4, 'name': 'pineapple', 'qty': 3, 'rating': 5, 'color': 'yellow'}
Operadores lógicos
Los operadores lógicos vinculan documentos mediante la lógica aplicada a los resultados de dos o más conjuntos de expresiones. A continuación, se muestra una lista de operadores lógicos:
$and, que devuelve todos los documentos que coinciden con las condiciones de todas las cláusulas$or, que devuelve todos los documentos que coinciden con las condiciones de una cláusula$nor, que devuelve todos los documentos que no coinciden con las condiciones de ninguna cláusula$not, que devuelve todos los documentos que no coinciden con la expresión
Para obtener más información sobre los operadores lógicos, consulte la guía Operadores de consulta lógica en el manual del servidor MongoDB.
El siguiente ejemplo especifica un operador lógico en un filtro de query como parámetro del método find(). El código devuelve todos los documentos con un valor en el campo qty mayor que 5 o un valor de campo color igual a "yellow". Seleccione la pestaña Synchronous o Asynchronous para ver el código correspondiente:
results = collection.find({ "$or": [ { "qty": { "$gt": 5 }}, { "color": "yellow" } ] }) for f in results: print(f)
{'_id': 2, 'name': 'bananas', 'qty': 7, 'rating': 4, 'color': 'yellow', 'type': ['cavendish']} {'_id': 3, 'name': 'oranges', 'qty': 6, 'rating': 2, 'type': ['naval', 'mandarin']} {'_id': 4, 'name': 'pineapple', 'qty': 3, 'rating': 5, 'color': 'yellow'}
results = collection.find({ "$or": [ { "qty": { "$gt": 5 }}, { "color": "yellow" } ] }) async for f in results: print(f)
{'_id': 2, 'name': 'bananas', 'qty': 7, 'rating': 4, 'color': 'yellow', 'type': ['cavendish']} {'_id': 3, 'name': 'oranges', 'qty': 6, 'rating': 2, 'type': ['naval', 'mandarin']} {'_id': 4, 'name': 'pineapple', 'qty': 3, 'rating': 5, 'color': 'yellow'}
Operadores de arreglos
Los operadores de matriz buscan coincidencias de documentos según el valor o la cantidad de elementos en un campo de matriz. A continuación, se muestra una lista de operadores de matriz disponibles:
$all, que devuelve documentos con matrices que contienen todos los elementos de la consulta$elemMatch, que devuelve documentos si un elemento en su campo de matriz coincide con todas las condiciones de la consulta$size, que devuelve todos los documentos con matrices de un tamaño especificado
Para obtener más información sobre los operadores de matriz, consulte la guía Operadores de consulta de matriz en el manual del servidor MongoDB.
El siguiente ejemplo especifica un operador de matriz en un filtro de consulta como parámetro del método find(). El código devuelve todos los documentos con un campo de matriz type que contiene 2 elementos. Seleccione la pestaña Synchronous o Asynchronous para ver el código correspondiente:
results = collection.find({ "type" : { "$size": 2 } }) for f in results: print(f)
{'_id': 1, 'name': 'apples', 'qty': 5, 'rating': 3, 'color': 'red', 'type': ['fuji', 'honeycrisp']} {'_id': 3, 'name': 'oranges', 'qty': 6, 'rating': 2, 'type': ['naval', 'mandarin']}
results = collection.find({ "type" : { "$size": 2 } }) async for f in results: print(f)
{'_id': 1, 'name': 'apples', 'qty': 5, 'rating': 3, 'color': 'red', 'type': ['fuji', 'honeycrisp']} {'_id': 3, 'name': 'oranges', 'qty': 6, 'rating': 2, 'type': ['naval', 'mandarin']}
Operadores de elementos
Los operadores de elementos consultan datos según la presencia o el tipo de un campo.
Para obtener más información sobre los operadores de elementos, consulte la guía Operadores de consulta de elementos en el manual de MongoDB Server.
El siguiente ejemplo especifica un operador de elemento en un filtro de consulta como parámetro del método find(). El código devuelve todos los documentos que tienen un campo color. Seleccione la pestaña Synchronous o Asynchronous para ver el código correspondiente:
results = collection.find( { "color" : { "$exists": "true" }} ) for f in results: print(f)
{'_id': 1, 'name': 'apples', 'qty': 5, 'rating': 3, 'color': 'red', 'type': ['fuji', 'honeycrisp']} {'_id': 2, 'name': 'bananas', 'qty': 7, 'rating': 4, 'color': 'yellow', 'type': ['cavendish']} {'_id': 4, 'name': 'pineapple', 'qty': 3, 'rating': 5, 'color': 'yellow'}
results = collection.find( { "color" : { "$exists": "true" }} ) async for f in results: print(f)
{'_id': 1, 'name': 'apples', 'qty': 5, 'rating': 3, 'color': 'red', 'type': ['fuji', 'honeycrisp']} {'_id': 2, 'name': 'bananas', 'qty': 7, 'rating': 4, 'color': 'yellow', 'type': ['cavendish']} {'_id': 4, 'name': 'pineapple', 'qty': 3, 'rating': 5, 'color': 'yellow'}
Operadores de evaluación
Los operadores de evaluación devuelven datos basados en evaluaciones de campos individuales o de los documentos de toda la colección.
La siguiente es una lista de operadores de evaluación comunes:
$text, que realiza una búsqueda de texto en los documentos$regex, que devuelve documentos que coinciden con una expresión regular especificada$mod, que realiza una operación de módulo sobre el valor de un campo y devuelve documentos donde el resto es un valor especificado
Para ver una lista completa de operadores de evaluación, consulte la guía Operadores de consulta de evaluación en el manual de MongoDB Server.
El siguiente ejemplo especifica un operador de evaluación en un filtro de consulta como parámetro del método find(). El código utiliza una expresión regular para devolver todos los documentos con un valor de campo name que contenga al menos dos caracteres "p" consecutivos. Seleccione la pestaña Synchronous o Asynchronous para ver el código correspondiente:
results = collection.find({ "name" : { "$regex" : "p{2,}" }} ) for f in results: print(f)
{'_id': 1, 'name': 'apples', 'qty': 5, 'rating': 3, 'color': 'red', 'type': ['fuji', 'honeycrisp']} {'_id': 4, 'name': 'pineapple', 'qty': 3, 'rating': 5, 'color': 'yellow'}
results = collection.find({ "name" : { "$regex" : "p{2,}" }} ) async for f in results: print(f)
{'_id': 1, 'name': 'apples', 'qty': 5, 'rating': 3, 'color': 'red', 'type': ['fuji', 'honeycrisp']} {'_id': 4, 'name': 'pineapple', 'qty': 3, 'rating': 5, 'color': 'yellow'}
Solución de problemas
No hay resultados al consultar un documento por ObjectId en aplicaciones web
Es común en las aplicaciones web codificar los ObjectId de los documentos en URL, como se muestra en el siguiente ejemplo de código:
"/posts/50b3bda58a02fb9a84d8991e"
Tu framework web pasa la parte ObjectId de la URL a tu controlador de solicitudes como una cadena. Debes convertir la cadena a una instancia ObjectId antes de pasarla al método find_one().
El siguiente ejemplo de código muestra cómo realizar esta conversión en una aplicación Flask. El proceso es similar para otros frameworks web.
from pymongo import MongoClient from bson.objectid import ObjectId from flask import Flask, render_template client = MongoClient() app = Flask(__name__) def show_post(_id): # NOTE!: converting _id from string to ObjectId before passing to find_one post = client.db.posts.find_one({'_id': ObjectId(_id)}) return render_template('post.html', post=post) if __name__ == "__main__": app.run()
Información Adicional
Para obtener más información sobre cómo consultar documentos, consulte la guía Consultar documentos en el manual de MongoDB Server.
Para obtener más información sobre cómo recuperar documentos con PyMongo, consulte Buscar documentos.
Documentación de la API
Para aprender más sobre cualquiera de los métodos o tipos analizados en esta guía, consulta la siguiente documentación de API: