Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /
Connect to MongoDB Data Sources

Protocolo de conexión

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

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.

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>

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

<email>:<password>

Campos

<email>

La dirección de correo electrónico registrada del usuario.

<password>

La contraseña del usuario.

Ejemplo

joe.mango@company.com:SuperSecretPassword123

Formato

_:<apiKey>

Campos

<apiKey>

Ejemplo

_:tOSJwYhLLam1qTAwP8rZ5M9BiHfn69w5xrya52dYeOv1PdTlD68i8gKOaN0Wy24z

Formato

_:<customAuthToken>

Campos

<customAuthToken>

Un token web JSONde autenticación personalizado.

Ejemplo

_:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

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>

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

authMechanism

Este parámetro siempre debe establecerse en PLAIN.

authSource

Este parámetro siempre debe establecerse en $external.

appName

Identifica de forma única la aplicación, el servicio MongoDB y el proveedor de autenticación al que desea conectarse.

El parámetro appName tiene el siguiente formato:

<app id>:<service>:<provider>

<app id>

La App ID de la Aplicación.

<service>

El nombre del servicio de MongoDB al que se quiere conectar. Este valor será siempre mongodb-atlas.

<provider>

El proveedor de autenticación para el que proporcionó credenciales.

Valid values:

  • local-userpass

  • api-key

  • custom-token

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.

1

En la sección Manage del menú de navegación de la izquierda, haz clic en Linked Data Sources.

En la lista de fuentes de datos, seleccione el clúster en el que desea habilitar conexiones de protocolo de cable.

2

Establezca el interruptor de MongoDB Connection String en Enabled. En la sección Método de Autenticación que aparece, elige y configura cómo deseas autenticar las conexiones del protocolo de conexión.

El interruptor Enable protocolo de conexión en la Interfaz de Usuario
3
1

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.

2

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,
...
}
}
3

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

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

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}

Puede llamar a funciones utilizando el comando de base de datos callFunction.

Comando
Descripción
Prototype
callFunction

Calls the specified function and returns any result.

{
callFunction: <function name>,
arguments: [<arg1>, <arg2>, ...]
}
> 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}}

Puede llamar a acciones de servicio utilizando el comando de base de datos callServiceFunction.

Comando
Descripción
Prototype
callServiceFunction

Llama a la acción de servicio especificada y devuelve cualquier resultado.

{
callServiceFunction: <function name>,
service: <service name>,
arguments: [<arg1>, <arg2>, ...]
}
> 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}}

Puede obtener el objeto de usuario para el usuario autenticado utilizando el userProfile comando de base de datos.

Comando
Descripción
Prototype
userProfile

Returns the user object for the authenticated user.

{
userProfile: 1
}
> 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'}}

Volver

preferencia de lectura

En esta página