Docs Menu
Docs Home
/ /
Conectarse a fuentes de datos de MongoDB

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

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.

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>

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

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

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>

El App ID de la Aplicación.

<service>

El nombre del servicio MongoDB al que desea conectarse. Este valor siempre será mongodb-atlas.

<provider>

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

Valid values:

  • local-userpass

  • api-key

  • custom-token

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.

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", seleccione y configure cómo desea autenticar las conexiones del protocolo de cable.

El interruptor para habilitar el protocolo de cable en la interfaz de usuario
3
1

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.

2

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,
...
}
}
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")

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}

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

Comando
Descripción
Prototipo
callFunction

Llama a la función especificada y devuelve cualquier resultado.

{
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
Prototipo
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
Prototipo
userProfile

Devuelve el objeto de usuario para el usuario autenticado.

{
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