Usare i comandi di estensione MongoDB per gestire i dati archiviati in Azure Cosmos DB for MongoDB

SI APPLICA A: MongoDB

Il documento seguente contiene i comandi di azione personalizzati specifici di Azure Cosmos DB for MongoDB. Questi comandi possono essere usati per creare e ottenere risorse di database specifiche per il modello di capacità di Azure Cosmos DB.

Usando Azure Cosmos DB for MongoDB, è possibile sfruttare i vantaggi condivisi di Azure Cosmos DB, che includono, ad esempio:

  • Distribuzione globale
  • Partizionamento orizzontale automatico
  • Disponibilità elevata
  • Garanzie di latenza
  • Crittografia dei dati inattivi
  • Backup

È possibile usufruire di questi vantaggi mantenendo al tempo stesso gli investimenti nelle applicazioni MongoDB esistenti. È possibile comunicare con Azure Cosmos DB for MongoDB usando uno dei driver client MongoDB open source. L'API Azure Cosmos DB for MongoDB consente di usare driver client esistenti aderendo al protocollo di collegamento MongoDB.

Supporto del protocollo MongoDB

Azure Cosmos DB for MongoDB è compatibile con le versioni 4.0, 3.6 e 3.2 del server MongoDB. Per altre informazioni, vedere Funzionalità supportate e sintassi per le versioni 4.0, 3.6 e 3.2.

I comandi di estensione seguenti creano e modificano le risorse specifiche di Azure Cosmos DB tramite richieste di database:

Creazione del database

Il comando di estensione CreateDatabase crea un nuovo database MongoDB. Il nome del database può essere usato dal contesto di database impostato dal comando use database. Nella tabella seguente sono descritti i parametri all'interno del comando:

Campo Tipo Descrizione
customAction string Nome del comando personalizzato. Il valore deve essere CreateDatabase.
offerThroughput int Velocità effettiva con provisioning impostata nel database. Il parametro è facoltativo.
autoScaleSettings Object Obbligatorio per la modalità di scalabilità automatica. Questo oggetto contiene le impostazioni associate alla modalità della capacità di scalabilità automatica. È possibile impostare il valore di maxThroughput, che descrive il numero più elevato di unità richiesta che può raggiungere dinamicamente la raccolta.

Output

Se il comando ha esito positivo, restituisce la risposta seguente:

{ "ok" : 1 }

Vedere l'output predefinito del comando personalizzato per i parametri nell'output.

Esempio: creare un database

Per creare un database denominato "test" che usa tutti i valori predefiniti, usare il comando seguente:

use test
db.runCommand({customAction: "CreateDatabase"});

Questo comando crea un database senza velocità effettiva a livello di database. Ciò significa che le raccolte all'interno di questo database devono specificare la quantità di velocità effettiva che è necessario usare.

Esempio: creare un database con velocità effettiva

Per creare un database denominato "test" e specificare una velocità effettiva con provisioning di 1000 UR a livello di database, usare il comando seguente:

use test
db.runCommand({customAction: "CreateDatabase", offerThroughput: 1000 });

Questo comando crea un database e imposta una velocità effettiva per tale database. Tutte le raccolte all'interno del database condividono la velocità effettiva impostata, a meno che non vengano create con un livello di velocità effettiva specifico.

Esempio: creare un database con velocità effettiva a scalabilità automatica

Per creare un database denominato "test" e per specificare una velocità effettiva massima a scalabilità automatica di 20.000 UR/sec a livello di database, usare il comando seguente:

use test
db.runCommand({customAction: "CreateDatabase", autoScaleSettings: { maxThroughput: 20000 } });

Aggiornare il database

Il comando di estensione UpdateDatabase aggiorna le proprietà associate al database specificato. La modifica del database per passare dalla velocità effettiva con provisioning a quella con scalabilità automatica e viceversa è supportata solo nel portale di Azure. Nella tabella seguente sono descritti i parametri all'interno del comando:

Campo Tipo Descrizione
customAction string Nome del comando personalizzato. Il valore deve essere UpdateDatabase.
offerThroughput int Nuova velocità effettiva con provisioning da impostare nel database se quest'ultimo usa la velocità effettiva a livello di database
autoScaleSettings Object Obbligatorio per la modalità di scalabilità automatica. Questo oggetto contiene le impostazioni associate alla modalità della capacità di scalabilità automatica. È possibile impostare il valore di maxThroughput, che descrive il numero più elevato di unità richiesta che può raggiungere dinamicamente il database.

Questo comando usa il database specificato nel contesto della sessione, che corrisponde a quello usato nel comando use <database>. Al momento, il nome del database non può essere modificato tramite questo comando.

Output

Se il comando ha esito positivo, restituisce la risposta seguente:

{ "ok" : 1 }

Vedere l'output predefinito del comando personalizzato per i parametri nell'output.

Esempio: aggiornare la velocità effettiva con provisioning associata a un database

Per aggiornare la velocità effettiva con provisioning di un database denominato "test" a 1200 UR, usare il comando seguente:

use test
db.runCommand({customAction: "UpdateDatabase", offerThroughput: 1200 });

Esempio: aggiornare la velocità effettiva a scalabilità automatica associata a un database

Per aggiornare la velocità effettiva con provisioning di un database denominato "test" a 20.000 UR o per trasformarla in un livello di velocità effettiva a scalabilità automatica, usare il comando seguente:

use test
db.runCommand({customAction: "UpdateDatabase", autoScaleSettings: { maxThroughput: 20000 } });

Recupera database

Il comando di estensione GetDatabase restituisce l'oggetto di database. Il nome del database viene usato dal contesto del database in cui viene eseguito il comando.

{
  customAction: "GetDatabase"
}

Nella tabella seguente sono descritti i parametri all'interno del comando:

Campo Tipo Descrizione
customAction string Nome del comando personalizzato. Il valore deve essere GetDatabase.

Output

Se il comando ha esito positivo, la risposta contiene un documento con i campi seguenti:

Campo Tipo Descrizione
ok int Stato della risposta. 1 = esito positivo. 0 = errore.
database string Nome del database di .
provisionedThroughput int Velocità effettiva con provisioning impostata nel database se il database usa velocità effettiva manuale a livello di database
autoScaleSettings Object Questo oggetto contiene i parametri di capacità associati al database se usa la modalità di scalabilità automatica. Il valore di maxThroughput descrive il numero più elevato di unità richiesta che può raggiungere dinamicamente il database.

Se l'esito è negativo, viene restituita una risposta predefinita del comando personalizzato. Vedere l'output predefinito del comando personalizzato per i parametri nell'output.

Esempio: ottenere il database

Per ottenere l'oggetto di database per un database denominato "test", usare il comando seguente:

use test
db.runCommand({customAction: "GetDatabase"});

Se al database non è associata alcuna velocità effettiva, l'output sarà:

{ "database" : "test", "ok" : 1 }

Se al database è associata una velocità effettiva manuale a livello di database, l'output mostrerà il valore di provisionedThroughput:

{ "database" : "test", "provisionedThroughput" : 20000, "ok" : 1 }

Se al database è associata una velocità effettiva a scalabilità automatica a livello di database, l'output mostrerà il valore di provisionedThroughput, che descrive il numero minimo di UR/sec per il database, e l'oggetto autoScaleSettings che include maxThroughput, che descrive il numero massimo di UR/sec per il database.

{
        "database" : "test",
        "provisionedThroughput" : 2000,
        "autoScaleSettings" : {
                "maxThroughput" : 20000
        },
        "ok" : 1
}

Crea raccolta

Il comando di estensione CreateCollection crea una nuova raccolta MongoDB. Il nome del database viene usato dal contesto dei database impostato dal comando use database. Il formato del comando CreateCollection è il seguente:

{
  customAction: "CreateCollection",
  collection: "<Collection Name>",
  shardKey: "<Shard key path>",
  // Replace the line below with "autoScaleSettings: { maxThroughput: (int) }" to use Autoscale instead of Provisioned Throughput. Fill the required Autoscale max throughput setting.
  offerThroughput: (int) // Provisioned Throughput enabled with required throughput amount set.
  indexes: [{key: {_id: 1}, name: "_id_1"}, ... ] // Optional indexes (3.6+ accounts only).
}

Nella tabella seguente sono descritti i parametri all'interno del comando:

Campo Type Obbligatorio Descrizione
customAction string Richiesto Nome del comando personalizzato. Il valore deve essere CreateCollection.
collection string Richiesto Nome della raccolta. Non sono consentiti caratteri speciali o spazi.
offerThroughput int Facoltativo Velocità effettiva con provisioning da impostare nel database. Se questo parametro non è specificato, viene impostato il valore minimo predefinito, ovvero 400 UR/sec. * Per specificare la velocità effettiva superiore a 10.000 UR/sec, è necessario il parametro shardKey.
shardKey string Obbligatorio per le raccolte con velocità effettiva elevata Percorso della chiave di partizione per la raccolta partizionata. Questo parametro è obbligatorio se si imposta un valore superiore a 10.000 UR/sec in offerThroughput. Se è specificato, tutti i documenti inseriti richiedono la chiave e il valore specificati.
autoScaleSettings Object Obbligatorio per la modalità di scalabilità automatica Questo oggetto contiene le impostazioni associate alla modalità della capacità di scalabilità automatica. È possibile impostare il valore di maxThroughput, che descrive il numero più elevato di unità richiesta che può raggiungere dinamicamente la raccolta.
indexes Array La configurazione degli indici è facoltativa. Questo parametro è supportato solo per gli account della versione 3.6 e successive. Quando questo campo è presente, è necessario un indice basato su _id. Ogni voce della matrice deve includere una chiave di uno o più campi, un nome e può contenere opzioni di indice. Ad esempio, per creare un indice univoco composto nei campi a e b, usare questa voce: {key: {a: 1, b: 1}, name:"a_1_b_1", unique: true}.

Output

Restituisce una risposta predefinita del comando personalizzato. Vedere l'output predefinito del comando personalizzato per i parametri nell'output.

Esempio: creare una raccolta con la configurazione minima

Per creare una nuova raccolta denominata "testCollection" e con i valori predefiniti, usare il comando seguente:

use test
db.runCommand({customAction: "CreateCollection", collection: "testCollection"});

Questa operazione ha come risultato una nuova raccolta fissa, non partizionata, con 400 UR/sec e un indice nel campo _id creato automaticamente. Questo tipo di configurazione si applica anche quando vengono create nuove raccolte tramite la funzione insert(). Ad esempio:

use test
db.newCollection.insert({});

Esempio: creare una raccolta non partizionata

Per creare una raccolta non partizionata denominata "testCollection" e con velocità effettiva con provisioning di 1000 UR, usare il comando seguente:

use test
db.runCommand({customAction: "CreateCollection", collection: "testCollection", offerThroughput: 1000});

È possibile creare una raccolta con un massimo di 10.000 UR/sec come offerThroughput senza dover specificare una chiave di partizione. Per le raccolte con una velocità effettiva maggiore, vedere la sezione successiva.

Esempio: creare una raccolta partizionata

Per creare una raccolta partizionata denominata "testCollection" e con velocità effettiva con provisioning di 11.000 UR e una proprietà shardkey "a.b", usare il comando seguente:

use test
db.runCommand({customAction: "CreateCollection", collection: "testCollection", offerThroughput: 11000, shardKey: "a.b" });

Questo comando richiede ora il parametro shardKey, poiché in offerThroughput sono specificate più di 10.000 UR/sec.

Esempio: creare una raccolta a scalabilità automatica non partizionata

Per creare una raccolta non partizionata denominata 'testCollection' che usa una capacità di velocità effettiva a scalabilità automatica impostata su 4000 UR/sec, usare il comando seguente:

use test
db.runCommand({ 
    customAction: "CreateCollection", collection: "testCollection", 
    autoScaleSettings:{
      maxThroughput: 4000
    } 
});

Come valore di autoScaleSettings.maxThroughput è possibile specificare un intervallo compreso tra 4000 UR/sec e 10.000 UR/sec senza una chiave di partizione. Per una velocità effettiva a scalabilità automatica più elevata, è necessario specificare il parametro shardKey.

Esempio: creare una raccolta a scalabilità automatica partizionata

Per creare una raccolta partizionata denominata 'testCollection', con una chiave di partizione chiamata 'a.b' e che usa una capacità di velocità effettiva a scalabilità automatica impostata su 20.000 UR/sec, usare il comando seguente:

use test
db.runCommand({customAction: "CreateCollection", collection: "testCollection", shardKey: "a.b", autoScaleSettings: { maxThroughput: 20000 }});

Aggiorna raccolta

Il comando di estensione UpdateCollection aggiorna le proprietà associate alla raccolta specificata. La modifica della raccolta dalla velocità effettiva con provisioning alla scalabilità automatica e viceversa è supportata solo nel portale di Azure.

{
  customAction: "UpdateCollection",
  collection: "<Name of the collection that you want to update>",
  // Replace the line below with "autoScaleSettings: { maxThroughput: (int) }" if using Autoscale instead of Provisioned Throughput. Fill the required Autoscale max throughput setting. Changing between Autoscale and Provisioned throughput is only supported in the Azure Portal.
  offerThroughput: (int) // Provisioned Throughput enabled with required throughput amount set.
  indexes: [{key: {_id: 1}, name: "_id_1"}, ... ] // Optional indexes (3.6+ accounts only).
}

Nella tabella seguente sono descritti i parametri all'interno del comando:

Campo Tipo Descrizione
customAction string Nome del comando personalizzato. Il valore deve essere UpdateCollection.
collection string Nome della raccolta.
offerThroughput int Velocità effettiva con provisioning da impostare nella raccolta.
autoScaleSettings Object Obbligatorio per la modalità di scalabilità automatica. Questo oggetto contiene le impostazioni associate alla modalità della capacità di scalabilità automatica. Il valore di maxThroughput descrive il numero più elevato di unità richiesta che può raggiungere dinamicamente la raccolta.
indexes Array La configurazione degli indici è facoltativa. Questo parametro è supportato solo per gli account della versione 3.6 e successive. Quando presente, il set di indici specificati (inclusa l'eliminazione degli indici) sostituisce gli indici esistenti della raccolta. È necessario un indice basato su _id. Ogni voce della matrice deve includere una chiave di uno o più campi, un nome e può contenere opzioni di indice. Ad esempio, per creare un indice univoco composto nei campi a e b, usare questa voce: {key: {a: 1, b: 1}, name: "a_1_b_1", unique: true}.

Output

Restituisce una risposta predefinita del comando personalizzato. Vedere l'output predefinito del comando personalizzato per i parametri nell'output.

Esempio: aggiornare la velocità effettiva con provisioning associata a una raccolta

Per aggiornare la velocità effettiva con provisioning di una raccolta denominata "testCollection" a 1200 UR, usare il comando seguente:

use test
db.runCommand({customAction: "UpdateCollection", collection: "testCollection", offerThroughput: 1200 });

Recupera una raccolta

Il comando personalizzato GetCollection restituisce l'oggetto raccolta.

{
  customAction: "GetCollection",
  collection: "<Name of the collection>"
}

Nella tabella seguente sono descritti i parametri all'interno del comando:

Campo Tipo Descrizione
customAction string Nome del comando personalizzato. Il valore deve essere GetCollection.
collection string Nome della raccolta.

Output

Se il comando ha esito positivo, la risposta contiene un documento con i campi seguenti

Campo Tipo Descrizione
ok int Stato della risposta. 1 = esito positivo. 0 = errore.
database string Nome del database di .
collection string Nome della raccolta.
shardKeyDefinition document Documento di specifica dell'indice usato come chiave di partizione. Questo campo è un parametro di risposta facoltativo.
provisionedThroughput int Velocità effettiva con provisioning da impostare nella raccolta. Questo campo è un parametro di risposta facoltativo.
autoScaleSettings Object Questo oggetto contiene i parametri di capacità associati al database se usa la modalità di scalabilità automatica. Il valore di maxThroughput descrive il numero più elevato di unità richiesta che può raggiungere dinamicamente la raccolta.

Se l'esito è negativo, viene restituita una risposta predefinita del comando personalizzato. Vedere l'output predefinito del comando personalizzato per i parametri nell'output.

Esempio: ottenere la raccolta

Per ottenere l'oggetto raccolta per una raccolta denominata "testCollection", usare il comando seguente:

use test
db.runCommand({customAction: "GetCollection", collection: "testCollection"});

Se la raccolta ha una capacità di velocità effettiva associata, include il valore di provisionedThroughput e l'output sarà:

{
        "database" : "test",
        "collection" : "testCollection",
        "provisionedThroughput" : 400,
        "ok" : 1
}

Se la raccolta ha una velocità effettiva a scalabilità automatica associata, include l'oggetto autoScaleSettings con il parametro maxThroughput, che definisce la velocità effettiva massima raggiungibile dalla raccolta. Include inoltre il valore provisionedThroughput, che definisce la velocità effettiva minima per questa raccolta se non sono presenti richieste:

{
        "database" : "test",
        "collection" : "testCollection",
        "provisionedThroughput" : 1000,
        "autoScaleSettings" : {
            "maxThroughput" : 10000
        },
        "ok" : 1
}

Se la raccolta condivide la velocità effettiva a livello di database, in modalità di scalabilità automatica o manuale, l'output sarà:

{ "database" : "test", "collection" : "testCollection", "ok" : 1 }
{
        "database" : "test",
        "provisionedThroughput" : 2000,
        "autoScaleSettings" : {
            "maxThroughput" : 20000
        },
        "ok" : 1
}

Parallelizzazione dei flussi di modifiche

Quando si usano flussi di modifiche su larga scala, è consigliabile distribuire il carico in maniera uniforme. Il comando seguente restituisce uno o più token di ripresa del flusso di modifiche, ognuno corrispondente ai dati di una singola partizione/partizione fisica (più partizioni/partizioni logiche possono esistere in una sola partizione fisica). Ogni token di ripresa fa sì che watch() restituisca solo dati da tale partizione/partizione fisica.

Usare db.collection.watch() su ogni token di ripresa (un thread per token) per ridimensionare i flussi di modifiche in modo efficiente.

{
        customAction: "GetChangeStreamTokens", 
        collection: "<Name of the collection>", 
        startAtOperationTime: "<BSON Timestamp>" // Optional. Defaults to the time the command is run.
} 

Esempio: ottenere il token di flusso

Eseguire il comando personalizzato per ottenere un token di ripresa per ogni partizione/partizione fisica.

use test
db.runCommand({customAction: "GetChangeStreamTokens", collection: "<Name of the collection>"})

Eseguire un thread/processo watch() per ogni token di ripresa restituito dal comando personalizzato GetChangeStreamTokens. Ecco un esempio per un thread.

db.test_coll.watch([{ $match: { "operationType": { $in: ["insert", "update", "replace"] } } }, { $project: { "_id": 1, "fullDocument": 1, "ns": 1, "documentKey": 1 } }], 
{fullDocument: "updateLookup", 
resumeAfter: { "_data" : BinData(0,"eyJWIjoyLCJSaWQiOiJQeFVhQUxuMFNLRT0iLCJDb250aW51YXRpb24iOlt7IkZlZWRSYW5nZSI6eyJ0eXBlIjoiRWZmZWN0aXZlIFBhcnRpdGlvbiBLZXkgUmFuZ2UiLCJ2YWx1ZSI6eyJtaW4iOiIiLCJtYXgiOiJGRiJ9fSwiU3RhdGUiOnsidHlwZSI6ImNvbnRpbndkFLbiIsInZhbHVlIjoiXCIxODQ0XCIifX1dfQ=="), "_kind" : NumberInt(1)}})

Il documento (valore) nel campo resumeAfter rappresenta il token di ripresa. Il comando watch() restituisce un cursore per tutti i documenti inseriti, aggiornati o sostituiti da tale partizione fisica dopo l'esecuzione del comando personalizzato GetChangeStreamTokens. Di seguito è riportato un esempio dei dati restituiti.

{
  "_id": {
    "_data": BinData(0,
    "eyJWIjoyLCJSaWQiOiJQeFVhQUxuMFNLRT0iLCJDfdsfdsfdsft7IkZlZWRSYW5nZSI6eyJ0eXBlIjoiRWZmZWN0aXZlIFBhcnRpdGlvbiBLZXkgUmFuZ2UiLCJ2YWx1ZSI6eyJtaW4iOiIiLCJtYXgiOiJGRiJ9fSwiU3RhdGUiOnsidHlwZSI6ImNvbnRpbnVhdGlvbiIsInZhbHVlIjoiXCIxOTgwXCIifX1dfQ=="),
    "_kind": 1
  },
  "fullDocument": {
    "_id": ObjectId("60da41ec9d1065b9f3b238fc"),
    "name": John,
    "age": 6
  },
  "ns": {
    "db": "test-db",
    "coll": "test_coll"
  },
  "documentKey": {
    "_id": ObjectId("60da41ec9d1065b9f3b238fc")
  }
}

Ogni documento restituito include un token di ripresa (sono tutti uguali per ogni pagina). Questo token deve essere archiviato e riutilizzato se il thread/processo muore. Il token riprende dal punto in cui è avvenuta l'interruzione e riceve i dati solo da tale partizione fisica.

Output predefinito di un comando personalizzato

Se non specificato, una risposta personalizzata contiene un documento con i campi seguenti:

Campo Tipo Descrizione
ok int Stato della risposta. 1 = esito positivo. 0 = errore.
code int Restituito solo quando il comando ha avuto esito negativo, ovvero ok == 0. Contiene il codice di errore MongoDB. Questo campo è un parametro di risposta facoltativo.
errMsg string Restituito solo quando il comando ha avuto esito negativo, ovvero ok == 0. Contiene una messaggio di errore descrittivo. Questo campo è un parametro di risposta facoltativo.

Ad esempio:

{ "ok" : 1 }

Passaggi successivi

È quindi possibile proseguire per apprendere i concetti di Azure Cosmos DB seguenti: