稳定的API
什么是稳定API,你应该使用它吗?
MongoDB稳定API(以前称为版本API)允许您随时升级MongoDB服务器,并确保MongoDB版本之间的行为变化不会破坏您的应用程序。
MongoDB 5.0引入了稳定API,用于与MongoDB服务器产品通信的应用程序。稳定API允许您指定应用程序运行的MongoDB API版本。
稳定API为应用程序提供长期API稳定性,支持更频繁的发布和自动服务器升级。这使得您的应用程序可以利用快速发布的功能,而不会风险向后不兼容的更改。
即使您没有明确指定apiVersion.
稳定API包括MongoDB命令的子集,应用程序使用这些命令读取和写入数据,创建集合和索引,以及执行其他常见任务。
注意
从2022年2月开始,“版本API”术语已更改为“稳定API”。所有概念和功能在此命名更改后保持不变。
向后兼容性保证
您的应用程序不会因为服务器升级而产生显著的行为变化。只要新服务器支持您指定的API版本,此保证就有效。
为了确保向后兼容性,您的应用程序必须
- 声明API版本 
- 仅使用指定API版本中支持的命令和功能 
- 使用官方驱动程序的兼容版本进行部署 
声明API版本
➤使用页面上方的选择语言下拉菜单设置此页面的示例语言。
要使用稳定API,请升级到最新驱动程序并创建应用程序的MongoClient
mongosh --apiVersion 1 
mongoc_client_t *client = NULL; mongoc_server_api_t *server_api = NULL; mongoc_server_api_version_t server_api_version; bson_error_t error; /* For a replica set, include the replica set name and a seedlist of the  * members in the URI string; e.g.  * uri_repl = "mongodb://mongodb0.example.com:27017,mongodb1.example.com:" \  *    "27017/?replicaSet=myRepl";  * client = mongoc_client_new (uri_repl);  * For a sharded cluster, connect to the mongos instances; e.g.  * uri_sharded =  * "mongodb://mongos0.example.com:27017,mongos1.example.com:27017/";  * client = mongoc_client_new (uri_sharded);  */ /* Create a mongoc_client_t without server API options configured. */ client = get_client_for_version_api_example (); mongoc_server_api_version_from_string ("1", &server_api_version); server_api = mongoc_server_api_new (server_api_version); assert (mongoc_client_set_server_api (client, server_api, &error)); 
using namespace mongocxx; uri client_uri{"mongodb://"}; // Create an option set for API v1 const auto server_api_opts =     options::server_api{options::server_api::version_from_string("1")}; // Store it in the set of client options const auto client_opts =     options::client{}         .server_api_opts(server_api_opts); // Set the version // Create a new client with the options mongocxx::client client{client_uri, client_opts}; 
var connectionString = "mongodb://"; var serverApi = new ServerApi(ServerApiVersion.V1); var mongoClientSettings = MongoClientSettings.FromConnectionString(connectionString); mongoClientSettings.ServerApi = serverApi; var mongoClient = new MongoClient(mongoClientSettings); 
// StableAPIExample is an example of creating a client with stable API. func StableAPIExample() { 	ctx := context.TODO() 	// For a replica set, include the replica set name and a seedlist of the members in the URI string; e.g. 	// uri := "mongodb://mongodb0.example.com:27017,mongodb1.example.com:27017/?replicaSet=myRepl" 	// For a sharded cluster, connect to the mongos instances; e.g. 	// uri := "mongodb://mongos0.example.com:27017,mongos1.example.com:27017/" 	uri := mtest.ClusterURI() 	serverAPIOptions := options.ServerAPI(options.ServerAPIVersion1) 	clientOpts := options.Client().ApplyURI(uri).SetServerAPIOptions(serverAPIOptions) 	client, err := mongo.Connect(clientOpts) 	if err != nil { 		panic(err) 	} 	defer func() { _ = client.Disconnect(ctx) }() } 
MongoClient client = MongoClients.create(         MongoClientSettings.builder()         .applyConnectionString(new ConnectionString(<connection string>))         .serverApi(                 ServerApi.builder()                 .version(ServerApiVersion.V1)                 .build()                 ).build()         ); return client; 
val serverApi = ServerApi.builder()     .version(ServerApiVersion.V1)     .build() val settings = MongoClientSettings.builder()     .applyConnectionString(ConnectionString("<connection string>"))     .serverApi(serverApi)     .build() val client = MongoClient.create(settings) 
    from pymongo.server_api import ServerApi     client = AsyncIOMotorClient(uri, server_api=ServerApi("1")) 
client = new MongoClient(uri, { serverApi: { version: '1' } }); 
$serverApi = new \MongoDB\Driver\ServerApi('1'); $client = new \MongoDB\Client($uriString, [], ['serverApi' => $serverApi]); 
from pymongo.server_api import ServerApi MongoClient(uri, server_api=ServerApi("1")) 
client = Mongo::Client.new(uri_string, server_api: {version: "1"}) 
let mut options = ClientOptions::parse(&uri).await?; let server_api = ServerApi::builder().version(ServerApiVersion::V1).build(); options.server_api = Some(server_api); let client = Client::with_options(options)?; 
    let opts = MongoClientOptions(         serverAPI: MongoServerAPI(version: .v1)     )     let client = try MongoClient(uri, using: myEventLoopGroup, options: opts) 
    let opts = MongoClientOptions(         serverAPI: MongoServerAPI(version: .v1)     )     let client = try MongoClient(uri, options: opts) 
"1"是当前唯一可用的API版本。
默认情况下,客户端是非严格的。非严格客户端允许您运行任何命令,无论它是否属于稳定API。
检查客户端API版本
使用serverStatus命令检查应用程序配置的API版本。对于连接到您的MongoDB实例的每个应用程序,apiVersions文档中都会出现一个appname。
有关更多信息,请参阅metrics.apiVersions。
db.runCommand( { serverStatus: 1 } ).metrics.apiVersions 
创建严格客户端
严格客户端拒绝所有稳定API之外的命令。尝试使用稳定API之外的命令将收到APIVersionError响应。
严格客户端在不支持索引类型的查询规划和执行期间也会忽略。
使用示例代码创建严格客户端
mongosh --apiVersion 1 --apiStrict 
mongoc_client_t *client = NULL; mongoc_server_api_t *server_api = NULL; mongoc_server_api_version_t server_api_version; bson_error_t error; /* For a replica set, include the replica set name and a seedlist of the  * members in the URI string; e.g.  * uri_repl = "mongodb://mongodb0.example.com:27017,mongodb1.example.com:" \  *    "27017/?replicaSet=myRepl";  * client = mongoc_client_new (uri_repl);  * For a sharded cluster, connect to the mongos instances; e.g.  * uri_sharded =  * "mongodb://mongos0.example.com:27017,mongos1.example.com:27017/";  * client = mongoc_client_new (uri_sharded);  */ /* Create a mongoc_client_t without server API options configured. */ client = get_client_for_version_api_example (); mongoc_server_api_version_from_string ("1", &server_api_version); server_api = mongoc_server_api_new (server_api_version); mongoc_server_api_strict (server_api, true); assert (mongoc_client_set_server_api (client, server_api, &error)); 
using namespace mongocxx; uri client_uri{"mongodb://"}; // Create an option set for API v1 const auto server_api_opts =     options::server_api{options::server_api::version_from_string("1")}         .strict(true);  // Enable strict mode for the server API // Store it in the set of client options const auto client_opts =     options::client{}         .server_api_opts(server_api_opts); // Set the version and options // Create a new client with the options mongocxx::client client{client_uri, client_opts}; 
var connectionString = "mongodb://"; var serverApi = new ServerApi(ServerApiVersion.V1, strict: true); var mongoClientSettings = MongoClientSettings.FromConnectionString(connectionString); mongoClientSettings.ServerApi = serverApi; var mongoClient = new MongoClient(mongoClientSettings); 
// StableAPIStrictExample is an example of creating a client with strict stable API. func StableAPIStrictExample() { 	ctx := context.TODO() 	// For a replica set, include the replica set name and a seedlist of the members in the URI string; e.g. 	// uri := "mongodb://mongodb0.example.com:27017,mongodb1.example.com:27017/?replicaSet=myRepl" 	// For a sharded cluster, connect to the mongos instances; e.g. 	// uri := "mongodb://mongos0.example.com:27017,mongos1.example.com:27017/" 	uri := mtest.ClusterURI() 	serverAPIOptions := options.ServerAPI(options.ServerAPIVersion1).SetStrict(true) 	clientOpts := options.Client().ApplyURI(uri).SetServerAPIOptions(serverAPIOptions) 	client, err := mongo.Connect(clientOpts) 	if err != nil { 		panic(err) 	} 	defer func() { _ = client.Disconnect(ctx) }() } 
MongoClient client = MongoClients.create(         MongoClientSettings.builder()         .applyConnectionString(new ConnectionString(<connection string>))         .serverApi(                 ServerApi.builder()                 .version(ServerApiVersion.V1)                 .strict(true)                 .build()                 ).build()         ); return client; 
val serverApi = ServerApi.builder()     .version(ServerApiVersion.V1)     .strict(true)     .build() 
    client = AsyncIOMotorClient(uri, server_api=ServerApi("1", strict=True)) 
client = new MongoClient(uri, { serverApi: { version: '1', strict: true } }); 
$serverApi = new \MongoDB\Driver\ServerApi('1', true); $client = new \MongoDB\Client($uriString, [], ['serverApi' => $serverApi]); 
MongoClient(uri, server_api=ServerApi("1", strict=True)) 
client = Mongo::Client.new(uri_string, server_api: {version: "1", strict: true}) 
let mut options = ClientOptions::parse(&uri).await?; let server_api = ServerApi::builder()     .version(ServerApiVersion::V1)     .strict(true)     .build(); options.server_api = Some(server_api); let client = Client::with_options(options)?; 
    let opts = MongoClientOptions(         serverAPI: MongoServerAPI(version: .v1, strict: true)     )     let client = try MongoClient(uri, using: myEventLoopGroup, options: opts) 
    let opts = MongoClientOptions(         serverAPI: MongoServerAPI(version: .v1, strict: true)     )     let client = try MongoClient(uri, options: opts) 
迁移到稳定API命令
要将您的应用程序迁移到使用稳定API,您必须
- 使用新的MongoClient选项运行应用程序的测试套件。 
- 确定您正在使用哪些位于稳定API之外的命令和功能。 
- 将到稳定API中的替代命令和功能迁移。 
一旦您的应用程序仅使用稳定API中定义的命令和功能,您就可以使用新的MongoClient选项重新部署它,并且可以确信未来的服务器升级不会对您的应用程序产生负面影响。
如何在稳定API之外使用命令和功能
要使用稳定API之外的命令和功能,您可以使用一个非严格客户端连接到您的部署。默认情况下,客户端都是非严格的。
要创建一个非严格客户端,请使用以下示例代码:
mongosh --apiVersion 1 
mongoc_client_t *client = NULL; mongoc_server_api_t *server_api = NULL; mongoc_server_api_version_t server_api_version; bson_error_t error; /* For a replica set, include the replica set name and a seedlist of the  * members in the URI string; e.g.  * uri_repl = "mongodb://mongodb0.example.com:27017,mongodb1.example.com:" \  *    "27017/?replicaSet=myRepl";  * client = mongoc_client_new (uri_repl);  * For a sharded cluster, connect to the mongos instances; e.g.  * uri_sharded =  * "mongodb://mongos0.example.com:27017,mongos1.example.com:27017/";  * client = mongoc_client_new (uri_sharded);  */ /* Create a mongoc_client_t without server API options configured. */ client = get_client_for_version_api_example (); mongoc_server_api_version_from_string ("1", &server_api_version); server_api = mongoc_server_api_new (server_api_version); mongoc_server_api_strict (server_api, false); assert (mongoc_client_set_server_api (client, server_api, &error)); 
using namespace mongocxx; uri client_uri{"mongodb://"}; // Create an option set for API v1 const auto server_api_opts =     options::server_api{options::server_api::version_from_string("1")}         .strict(false);  // Explicitly disable strict mode for the server API // Store it in the set of client options const auto client_opts =     options::client{}         .server_api_opts(server_api_opts); // Set the version and options // Create a new client with the options mongocxx::client client{client_uri, client_opts}; 
var connectionString = "mongodb://"; var serverApi = new ServerApi(ServerApiVersion.V1, strict: false); var mongoClientSettings = MongoClientSettings.FromConnectionString(connectionString); mongoClientSettings.ServerApi = serverApi; var mongoClient = new MongoClient(mongoClientSettings); 
// StableAPINonStrictExample is an example of creating a client with non-strict stable API. func StableAPINonStrictExample() { 	ctx := context.TODO() 	// For a replica set, include the replica set name and a seedlist of the members in the URI string; e.g. 	// uri := "mongodb://mongodb0.example.com:27017,mongodb1.example.com:27017/?replicaSet=myRepl" 	// For a sharded cluster, connect to the mongos instances; e.g. 	// uri := "mongodb://mongos0.example.com:27017,mongos1.example.com:27017/" 	uri := mtest.ClusterURI() 	serverAPIOptions := options.ServerAPI(options.ServerAPIVersion1).SetStrict(false) 	clientOpts := options.Client().ApplyURI(uri).SetServerAPIOptions(serverAPIOptions) 	client, err := mongo.Connect(clientOpts) 	if err != nil { 		panic(err) 	} 	defer func() { _ = client.Disconnect(ctx) }() } 
MongoClient client = MongoClients.create(         MongoClientSettings.builder()         .applyConnectionString(new ConnectionString(<connection string>))         .serverApi(                 ServerApi.builder()                 .version(ServerApiVersion.V1)                 .strict(false)                 .build()                 ).build()         ); 
val serverApi = ServerApi.builder()     .version(ServerApiVersion.V1)     .strict(false)     .build() 
    client = AsyncIOMotorClient(uri, server_api=ServerApi("1", strict=False)) 
client = new MongoClient(uri, { serverApi: { version: '1', strict: false } }); 
$serverApi = new \MongoDB\Driver\ServerApi('1', false); $client = new \MongoDB\Client($uriString, [], ['serverApi' => $serverApi]); 
MongoClient(uri, server_api=ServerApi("1", strict=False)) 
client = Mongo::Client.new(uri_string, server_api: {version: "1", strict: false}) 
let mut options = ClientOptions::parse(&uri).await?; let server_api = ServerApi::builder()     .version(ServerApiVersion::V1)     .strict(false)     .build(); options.server_api = Some(server_api); let client = Client::with_options(options)?; 
    let opts = MongoClientOptions(         serverAPI: MongoServerAPI(version: .v1, strict: false)     )     let client = try MongoClient(uri, using: myEventLoopGroup, options: opts) 
    let opts = MongoClientOptions(         serverAPI: MongoServerAPI(version: .v1, strict: false)     )     let client = try MongoClient(uri, options: opts) 
使用这个非严格客户端允许您在稳定API之外运行命令。例如,这个非严格客户端允许您运行createUser命令。
重要
稳定API之外的命令和功能不保证与版本化替代方案相同的向后兼容性。
稳定API命令
稳定API V1中包含的数据库命令取决于您使用的MongoDB版本。要查看稳定API中包含的数据库命令及其引入的MongoDB版本,请参阅稳定API更改日志。
参数
您可以在应用程序的MongoDB驱动程序连接代码中指定以下可选参数。有关更多信息,请查阅您在应用程序中使用的MongoDB驱动程序文档。
| 参数 | 类型 | 描述 | 
|---|---|---|
| string | 指定API版本。目前仅支持版本 "1"。 | |
| boolean | 
 如果您指定了 apiStrict,则必须也指定 apiVersion。 如果未指定,默认为  | |
| boolean | 如果设置为  如果未指定,默认为  | 
行为
参数验证
从MongoDB 5.0版本开始,API V1数据库命令在传递一个命令未明确接受的参数时会引发错误。
稳定API错误响应
此表显示了有问题的稳定API请求的错误响应。
| 服务器响应 | 请求 | 
|---|---|
| 指定与API版本 | |
| 指定与API版本 | |
| 指定服务器不支持的服务版本apiVersion。 | |
| 指定了 |