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.
Compatible Clients
Puedes usar las siguientes herramientas y controladores para comunicarte con los Servicios de aplicación usando 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 a través del protocolo de conexión tienen acceso a todas las funcionalidades del Servicio MongoDB. Sin embargo, Servicios de aplicación no ofrece soporte para todas las operaciones y funcionalidades disponibles en herramientas y clientes estándar. Para más detalles, consulta 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
URL Encoding
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.
App Services connection strings have the following form:
mongodb://<credentials>@<region>.services.cloud.mongodb.com:27020/?<parameters>
credenciales
Todas las operaciones que emites a través del protocolo de conexión 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 nube donde se aloja 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 utilizando el formato <region>.<cloud>. Por ejemplo, una aplicación desplegada en aws-us-east-1 utilizarí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
|
Enable Wire Protocol Connections
Debes habilitar las conexiones de protocolo de conexión para clústeres vinculados antes de poder conectarte a una App Services App con una cadena de conexión.
Obtenga la última versión de su aplicación
To enable MongoDB wire protocol connections with the App Services CLI, you need a local copy of your application's configuration files.
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.
Enable Wire Protocol for the Cluster
Para habilitar las conexiones del protocolo de conexión en un clúster vinculado, abre el archivo config.json del clúster y establece 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.
Deploy the Updated Data Source Configuration
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
Conéctese con App Services utilizando 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
While connected to App Services over the wire protocol you can use standard MongoDB CRUD operations. App Services applies role-based data access rules to all queries in the context of the authenticated user specified in the connection string credentials.
> 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 | Prototype | ||||
|---|---|---|---|---|---|---|
Calls the specified function and returns any result. | |
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 | Prototype | |||||
|---|---|---|---|---|---|---|---|
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 | Prototype | |||
|---|---|---|---|---|---|
Returns the user object for the authenticated user. | |
> 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'}}
