Overview
Atlas App Services implementa de forma nativa un subconjunto del protocolo de conexión MongoDB, lo que permite conectarse a una aplicación a través de una de sus fuentes de datos MongoDB Atlas vinculadas mediante controladores y herramientas estándar de MongoDB. Los clientes utilizan un... Cadena de conexión de App Services para conectar y enviar solicitudes. App Services admite la mayoría de las funciones del cliente a través del protocolo de red, incluyendo reglas de acceso a datos basadas en roles, funciones y acciones de servicio.
Esta es una buena opción para lenguajes que actualmente no cuentan con un SDK de Realm. Los ejemplos aquí son para Python, C++11 y Mongo Shell. Cualquier controlador de MongoDB compatible con
appName El parámetro de cadena de conexión puede utilizar el protocolo de cable para conectarse a los servicios de aplicaciones.
Nota
Las fuentes de datos federadas no admiten conexiones a través del protocolo de cable.
Clientes compatibles
Puede utilizar las siguientes herramientas y controladores para comunicarse con App Services mediante una cadena de conexión:
Versión 4.0+ del shell mongo.
Cualquier controlador de MongoDB que admita el parámetro de cadena de conexión
appName. Todos los controladores oficiales de MongoDB admiten este parámetro en sus versiones actuales.
Nota
Las conexiones a App Services mediante el protocolo de red ofrecen acceso a todas las funciones del servicio MongoDB. Sin embargo, App Services no admite todas las operaciones y funciones disponibles en las herramientas y clientes estándar. Para más información, consulte Limitaciones del servicio MongoDB.
Cadenas de conexión
Para conectarse a App Services a través del protocolo de cable, debe construir una cadena de conexión MongoDB que incluya credenciales para un usuario de la aplicación y un appName parámetro de consulta específico de la aplicación.
Importante
Codificación de URL
Debes codificar la URL Cadenas de conexión antes de poder usarlas para conectarse a App Services. Las cadenas de conexión en la interfaz de usuario de App Services están codificadas correctamente de forma predeterminada.
Las cadenas de conexión de App Services tienen el siguiente formato:
mongodb://<credentials>@<region>.services.cloud.mongodb.com:27020/?<parameters>
Credenciales
Todas las operaciones que se realizan a través del protocolo de red se ejecutan en el contexto de un usuario de aplicación específico que se especifica en la cadena de conexión. El usuario debe estar registrado con uno de los siguientes proveedores de autenticación:
El contenido de las credenciales de la cadena de conexión depende del proveedor de autenticación con el que se registró el usuario:
Formato |
| ||||
Campos |
| ||||
Ejemplo | |
Formato |
| ||
Campos |
| ||
Ejemplo | |
Formato |
| |||
Campos |
| |||
Ejemplo | |
Región
La cadena de conexión debe especificar la región de implementación y el proveedor de la nube en el que está alojada la aplicación.
Las aplicaciones globales utilizan la región global:
mongodb://<credentials>@global.services.cloud.mongodb.com:27020/?<parameters>
Las aplicaciones locales especifican el proveedor de la nube y el nombre de la región con el formato <region>.<cloud>. Por ejemplo, una aplicación implementada en aws-us-east-1 usaría la siguiente cadena de conexión:
mongodb://<credentials>@us-east-1.aws.services.cloud.mongodb.com:27020/?<parameters>
Parámetros
App Services requiere opciones de cadena de conexión específicas que identifiquen la aplicación a la que desea conectarse y el proveedor de autenticación asociado con las credenciales que proporciona.
Las cadenas de conexión de App Services tienen los siguientes parámetros de consulta:
Parameter | Descripción | |||||||
|---|---|---|---|---|---|---|---|---|
| Este parámetro siempre debe establecerse en | |||||||
| Este parámetro siempre debe establecerse en | |||||||
| Identifica de forma única la aplicación, el servicio MongoDB y el proveedor de autenticación al que desea conectarse. El parámetro
|
Habilitar conexiones de protocolo de cable
Debe habilitar las conexiones de protocolo de cable para un clúster vinculado antes de poder conectarse a una aplicación de App Services con una cadena de conexión.
Obtenga la última versión de su aplicación
Para habilitar las conexiones del protocolo de cable MongoDB con la CLI de App Services, necesita una copia local de los archivos de configuración de su aplicación.
Para extraer una copia local de la última versión de su aplicación, ejecute lo siguiente:
appservices pull --remote="<Your App ID>"
Tip
También puedes descargar una copia de los archivos de configuración de tu aplicación desde la pantalla Deploy > Export App en la Interfaz de usuario Realm.
Habilitar el protocolo de cable para el clúster
Para habilitar conexiones de protocolo de cable para un clúster vinculado, abra el archivo config.json del clúster y configure el valor de config.wireProtocolEnabled en true:
{ "name": "mongodb-atlas", "type": "mongodb-atlas", "config": { "wireProtocolEnabled": true, ... } }
Nota
Las fuentes de datos federadas no admiten conexiones a través del protocolo de cable.
Implementar la configuración de fuente de datos actualizada
Una vez habilitadas las conexiones de protocolo de cable para el clúster en config.json, puedes enviar la configuración a tu aplicación remota. La CLI de App Services implementa la actualización inmediatamente al enviarla.
appservices push --remote="<Your App ID>"
Protocolo de conexión a través del cable
Conectarse a los servicios de aplicaciones con una cadena de conexión
Para conectarse a App Services a través del protocolo de cable, pase una cadena de conexión de App Services codificada en URL cuando cree un cliente, tal como lo haría con una cadena de conexión normal.
mongo "mongodb://<user>:<password>@services.cloud.mongodb.com:27020/?authMechanism=PLAIN&authSource=%24external&ssl=true&appName=realm-application-abcde:mongodb-atlas:local-userpass"
mongocxx::instance instance{}; mongocxx::uri uri("mongodb://<user>:<password>@services.cloud.mongodb.com:27020/?authMechanism=PLAIN&authSource=%24external&ssl=true&appName=realm-application-abcde:mongodb-atlas:local-userpass"); mongocxx::client client(uri);
client = pymongo.MongoClient("mongodb://<user>:<password>@services.cloud.mongodb.com:27020/?authMechanism=PLAIN&authSource=%24external&ssl=true&appName=realm-application-abcde:mongodb-atlas:local-userpass")
Leer y modificar datos
Mientras esté conectado a App Services mediante el protocolo de conexión, puede usar operaciones CRUD estándar de MongoDB. App Services aplica reglas de acceso a datos basadas en roles a todas las consultas en el contexto del usuario autenticado especificado en las credenciales de la cadena de conexión.
> use HR > db.employees.findOne(); { "_id": ObjectId("5ae782e48f25b9dc5c51c4a5"), "employeeId": 854271626, "name": { "first": "Lucas", "last": "Lewis" }, "role": "PM", "salary": 200000, "email": "Lucas.Lewis.0271@company.com", "password": "<password>", "manager": { "id": 328892725, "email": "Daniel.Wilson.0474@company.com", "name": { "first": "Daniel", "last": "Wilson" } } }
mongocxx::database db = client["HR"]; mongocxx::collection employees = db["employees"]; bsoncxx::stdx::optional<bsoncxx::document::value> result = collection.find_one({}); if(result) { std::cout << bsoncxx::to_json(result) << "\n"; }
db = client["HR"] employee = db["employees"].find_one(); pprint(employee) {'_id': ObjectId('5ae782e48f25b9dc5c51c4a5'), 'email': 'Lucas.Lewis.0271@company.com', 'employeeId': 854271626.0, 'manager': {'email': 'Daniel.Wilson.0474@company.com', 'id': 328892725.0, 'name': {'first': 'Daniel', 'last': 'Wilson'}}, 'name': {'first': 'Lucas', 'last': 'Lewis'}, 'password': '<password>', 'role': 'PM', 'salary': 200000}
Llamar a una función
Puede llamar a funciones utilizando el comando de base de datos callFunction.
Comando | Descripción | Prototipo | ||||
|---|---|---|---|---|---|---|
Llama a la función especificada y devuelve cualquier resultado. | |
db.runCommand({ ... callFunction: "getEmployeeById", ... arguments: ["5ae782e48f25b9dc5c51c4a5"] ...}); { "ok" : 1, "response" : { "_id": ObjectId("5ae782e48f25b9dc5c51c4a5"), "employeeId": 854271626, "name": { "first": "Lucas", "last": "Lewis" }, "role": "PM", "salary": 200000, "email": "Lucas.Lewis.0271@company.com", "password": "<password>", "manager": { "id": 328892725, "email": "Daniel.Wilson.0474@company.com", "name": { "first": "Daniel", "last": "Wilson" } } } }
db.runCommand({ callFunction: "getEmployeeById", arguments: ["5ae782e48f25b9dc5c51c4a5"] });
function_result = db.command("callFunction", "getEmployeeById", arguments=["5ae782e48f25b9dc5c51c4a5"] ...) pprint.pprint(function_result) {'ok': 1, 'response': {'_id': ObjectId('5ae782e48f25b9dc5c51c4a5'), 'email': 'Lucas.Lewis.0271@company.com', 'employeeId': 854271626.0, 'manager': {'email': 'Daniel.Wilson.0474@company.com', 'id': 328892725.0, 'name': {'first': 'Daniel', 'last': 'Wilson'}}, 'name': {'first': 'Lucas', 'last': 'Lewis'}, 'password': '<password>', 'role': 'PM', 'salary': 200000}}
Llamar a una acción de servicio
Puede llamar a acciones de servicio utilizando el comando de base de datos callServiceFunction.
Comando | Descripción | Prototipo | |||||
|---|---|---|---|---|---|---|---|
Llama a la acción de servicio especificada y devuelve cualquier resultado. | |
> db.runCommand({ ... callServiceFunction: "get", ... service: "http", ... arguments: [{ url: "https://jsonplaceholder.typicode.com/todos/1" }] ... }); { "ok" : 1, "response" : { "status" : "200 OK", "statusCode" : 200, "contentLength" : NumberLong(-1), "headers" : { "Content-Type" : ["application/json; charset=utf-8"], "Connection" : ["keep-alive"], "Vary" : ["Origin, Accept-Encoding"], "X-Content-Type-Options" : ["nosniff"], "Via" : ["1.1 vegur"], "X-Powered-By" : ["Express"], "Cf-Cache-Status" : ["HIT"], "Expect-Ct" : ["max-age=604800, report-uri=\"https://example.com/cdn-cgi/beacon/expect-ct\""], "Set-Cookie" : ["__cfduid=d7f650e765d41beb7598ce2ab62d0c0191536867096; expires=Fri, 13-Sep-19 19:31:36 GMT; path=/; domain=.typicode.com; HttpOnly"], "Access-Control-Allow-Credentials" : ["true"], "Cache-Control" : ["public, max-age=14400"], "Pragma" : ["no-cache"], "Etag" : ["W/\"53-hfEnumeNh6YirfjyjaujcOPPT+s\""], "Server" : ["example.com"], "Cf-Ray" : ["459d08f88e1e56db-IAD"], "Date" : ["Thu, 13 Sep 2018 19:31:36 GMT"], "Expires" : ["Thu, 13 Sep 2018 23:31:36 GMT"] }, "cookies" : { "__cfduid" : { "value" : "d7f650e765d41beb7598ce2ab62d0c0191536867096", "path" : "/", "domain" : ".typicode.com", "expires" : "Mon, 01 Jan 0001 00:00:00 GMT", "maxAge" : 0, "secure" : false, "httpOnly" : true } }, "body" : BinData(0,"ewogICJ1c2VySWQiOiAxLAogICJpZCI6IDEsCiAgInRpdGxlIjogImRlbGVjdHVzIGF1dCBhdXRlbSIsCiAgImNvbXBsZXRlZCI6IGZhbHNlCn0=") } }
db.runCommand({ callServiceFunction: "get", service: "http", arguments: [{ url: "https://jsonplaceholder.typicode.com/todos/1" }] });
result = db.command("callServiceFunction", "get", service="http", arguments=[{"url": "https://jsonplaceholder.typicode.com/todos/1"}] ...) pprint.pprint(result) {'ok': 1, 'response': {'body': b'{\n "userId": 1,\n "id": 1,\n "title": "delectus aut' b' autem",\n "completed": false\n}', 'contentLength': -1, 'cookies': {'__cfduid': {'domain': '.typicode.com', 'expires': 'Mon, 01 Jan 0001 00:00:00 ' 'GMT', 'httpOnly': True, 'maxAge': 0, 'path': '/', 'secure': False, 'value': 'd4b10004e96ca7fee0be03dceebaf2ab71536866400'}}, 'headers': {'Access-Control-Allow-Credentials': ['true'], 'Cache-Control': ['public, max-age=14400'], 'Cf-Cache-Status': ['HIT'], 'Cf-Ray': ['459cf7fc7e20c1bd-IAD'], 'Connection': ['keep-alive'], 'Content-Type': ['application/json; charset=utf-8'], 'Date': ['Thu, 13 Sep 2018 19:20:00 GMT'], 'Etag': ['W/"53-hfEnumeNh6YirfjyjaujcOPPT+s"'], 'Expect-Ct': ['max-age=604800, ' 'report-uri="https://example.com/cdn-cgi/beacon/expect-ct"'], 'Expires': ['Thu, 13 Sep 2018 23:20:00 GMT'], 'Pragma': ['no-cache'], 'Server': ['example.com'], 'Set-Cookie': ['__cfduid=d4b10004e96ca7fee0be03dceebaf2ab71536866400; ' 'expires=Fri, 13-Sep-19 19:20:00 GMT; ' 'path=/; domain=.typicode.com; ' 'HttpOnly'], 'Vary': ['Origin, Accept-Encoding'], 'Via': ['1.1 vegur'], 'X-Content-Type-Options': ['nosniff'], 'X-Powered-By': ['Express']}, 'status': '200 OK', 'statusCode': 200}}
Obtener los datos del usuario que ha iniciado sesión
Puede obtener el objeto de usuario para el usuario autenticado utilizando el userProfile comando de base de datos.
Comando | Descripción | Prototipo | |||
|---|---|---|---|---|---|
Devuelve el objeto de usuario para el usuario autenticado. | |
> db.runCommand({ userProfile: 1 }); { "ok" : 1, "profile" : { "userid" : "5ad7a79e8f25b975898d77b8", "domainid" : ObjectId("5ad7a69746224c054067c8b1"), "identities" : [ { } ], "data" : "{\"email\":\"joe.mango@company.com\"}", "type" : "normal", "roleassignments" : [ ] } }
db.runCommand({ userProfile: 1 });
result = db.command("userProfile", 1) pprint.pprint(result) {'ok': 1, 'profile': {'data': '{"email":"joe.mango@company.com"}', 'domainid': ObjectId('5ad7a69746224c054067c8b1'), 'identities': [{}], 'roleassignments': [], 'type': 'normal', 'userid': '5ad7a79e8f25b975898d77b8'}}
