通過程序代碼連接MongoDB副本集實(shí)例
云數(shù)據(jù)庫MongoDB版完全兼容MongoDB協(xié)議,本文介紹如何使用不同語言的程序代碼連接MongoDB副本集實(shí)例。
前提條件
請(qǐng)根據(jù)您使用的語言下載并安裝官方驅(qū)動(dòng)程序,更多信息,請(qǐng)參見MongoDB Drivers 。
注意事項(xiàng)
如果副本集實(shí)例數(shù)據(jù)庫賬號(hào)的密碼中包含特殊字符!@#$%^&*()_+=
,您需要在連接串中對(duì)特殊字符進(jìn)行轉(zhuǎn)義處理,對(duì)應(yīng)如下:
特殊字符 | 轉(zhuǎn)義字符 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
示例:密碼為ab@#c
時(shí),在連接串中對(duì)特殊字符進(jìn)行轉(zhuǎn)義處理,密碼對(duì)應(yīng)為ab%40%23c
。
Node.js連接示例
Node.js驅(qū)動(dòng)相關(guān)信息,請(qǐng)參見MongoDB Node.js Driver。
在客戶端執(zhí)行如下命令,進(jìn)行項(xiàng)目初始化。
mkdir node-mongodb-demo cd node-mongodb-demo npm init -y
執(zhí)行如下命令,安裝驅(qū)動(dòng)包。
npm install mongodb
獲取云數(shù)據(jù)庫MongoDB副本集實(shí)例連接信息,如何獲取,請(qǐng)參見副本集實(shí)例連接說明。
將如下示例代碼保存為Node.js。
const MongoClient = require('mongodb').MongoClient; // 庫名稱和集合名稱。 const demoDb = "test"; const demoColl = "testColl"; // 建議使用副本集高可用地址,確保高可用。 // 確保執(zhí)行代碼的服務(wù)器和MongoDB實(shí)例網(wǎng)絡(luò)是連通的。 // 如果密碼中包含特殊字符,請(qǐng)進(jìn)行轉(zhuǎn)義處理。 const url = "mongodb://root:****@dds-2ze043****.mongodb.rds.aliyuncs.com:3717,dds-2ze043****.mongodb.rds.aliyuncs.com:3717/admin?replicaSet=mgset-63****" console.info("url:", url); // 獲取mongoClient。 const client = new MongoClient(url); async function run() { try { //連接實(shí)例。 await client.connect(); //取得數(shù)據(jù)庫句柄。 const database = client.db(demoDb); //取得集合句柄。 const collection = database.collection(demoColl); //組裝記錄。 const demoName = "Node For Demo"; const doc = { "DEMO": demoName, "MESG": "Hello AliCloudDB For MongoDB" }; console.info("ready insert document: ", doc); //插入一條記錄。 const result = await collection.insertOne(doc); console.log( `A document was inserted with the _id: ${result.insertedId}`, ); //讀取數(shù)據(jù)。 const filter = { "DEMO": demoName }; const findResult = await collection.find(filter); await findResult.forEach(console.dir); } finally { //關(guān)閉連接。 await client.close(); } } run().catch(console.dir);
運(yùn)行
node Node.js
。
PHP連接示例
PHP驅(qū)動(dòng)相關(guān)信息,請(qǐng)參見MongoDB PHP Driver。
執(zhí)行如下命令,安裝驅(qū)動(dòng)包。
$ pecl install mongodb # 獲取PHP的ini文件路徑。 $ php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||" # 在ini文件中添加如下信息,如果已經(jīng)有則不用添加。 $ extension=mongodb.so # 創(chuàng)建并進(jìn)入工程目錄。 $ mkdir php-demo $ cd php-demo # 使用composer安裝mongodb依賴。若未安裝composer,可通過https://getcomposer.org/download/路徑下載。 $ composer require mongodb/mongodb
獲取云數(shù)據(jù)庫MongoDB副本集實(shí)例連接信息,如何獲取,請(qǐng)參見副本集實(shí)例連接說明。
將如下示例代碼保存為main.php。
<?php require 'vendor/autoload.php'; // include Composer goodies // 建議使用副本集高可用地址,確保高可用。 // 確保執(zhí)行代碼的服務(wù)器和MongoDB實(shí)例網(wǎng)絡(luò)是連通的。 // 如果密碼中包含特殊字符,請(qǐng)進(jìn)行轉(zhuǎn)義處理。 $replicaset_url = 'mongodb://root:****@dds-2ze043****.mongodb.rds.aliyuncs.com:3717,dds-2ze043****.mongodb.rds.aliyuncs.com:3717/admin?replicaSet=mgset-63****'; $test_db = 'test'; $test_coll = 'testColl'; // 創(chuàng)建mongoclient。 $client = new MongoDB\Client($replicaset_url); $collection = $client->$test_db->$test_coll; // 插入一條記錄。 $result = $collection->insertOne(['name' => 'ApsaraDB for Mongodb', 'desc' => 'Hello, Mongodb']); echo "Inserted with Object ID '{$result->getInsertedId()}'", "\n"; // 查詢記錄。 $result = $collection->find(['name' => 'ApsaraDB for Mongodb']); foreach ($result as $entry) { echo $entry->_id, ': ', $entry->name, "\n"; } ?>
運(yùn)行
php -f main.php
。
Java連接示例
Java驅(qū)動(dòng)相關(guān)信息,請(qǐng)參見MongoDB Java Driver。
本示例測(cè)試的環(huán)境為IDE(IntelliJ IDEA和Eclipse IDE)。IDE環(huán)境下連接副本集實(shí)例,JDK需為JDK 8及以上版本。
獲取云數(shù)據(jù)庫MongoDB副本集實(shí)例連接信息,如何獲取,請(qǐng)參見副本集實(shí)例連接說明。
添加Maven依賴。
<dependencies> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-sync</artifactId> <version>4.8.0</version> </dependency> </dependencies>
Java示例代碼。
// JDK 8及以上。 import static com.mongodb.client.model.Filters.eq; import org.bson.Document; import com.mongodb.MongoException; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.result.InsertOneResult; public class Main { public static void main( String[] args ) { // 建議使用副本集高可用地址,確保高可用。 // 確保執(zhí)行代碼的服務(wù)器和MongoDB實(shí)例網(wǎng)絡(luò)是連通的。 // 如果密碼中包含特殊字符,請(qǐng)進(jìn)行轉(zhuǎn)義處理。 String uri = "mongodb://root:****@dds-2ze043****.mongodb.rds.aliyuncs.com:3717,dds-2ze043****.mongodb.rds.aliyuncs.com:3717/admin?replicaSet=mgset-63****"; String demoDb = "test"; String demoColl = "testColl"; try (MongoClient mongoClient = MongoClients.create(uri)) { MongoDatabase database = mongoClient.getDatabase(demoDb); MongoCollection<Document> collection = database.getCollection(demoColl); // 寫入一條記錄。 try { InsertOneResult result = collection.insertOne(new Document() .append("DEMO", "Java for Demo") .append("MESG", "Hello AliCloudDB For MongoDB")); System.out.println("Success! Inserted document id: " + result.getInsertedId()); } catch (MongoException me) { System.err.println("Unable to insert due to an error: " + me); } // 查詢第一條記錄。 Document doc = collection.find(eq("DEMO", "Java for Demo")).first(); System.out.println(doc.toJson()); mongoClient.close(); } } }
在IDE工具中單擊運(yùn)行。
Python連接示例
Python驅(qū)動(dòng)相關(guān)信息,請(qǐng)參見MongoDB Python Driver。
本示例測(cè)試的環(huán)境為Python 3.9。
安裝pymongo。
pip install pymongo
獲取云數(shù)據(jù)庫MongoDB副本集實(shí)例連接信息,如何獲取,請(qǐng)參見副本集實(shí)例連接說明。
將如下示例代碼保存為Main.py。
# 代碼運(yùn)行環(huán)境為python3.9。 from pymongo import MongoClient # 建議使用副本集高可用地址,確保高可用。 # 確保執(zhí)行代碼的服務(wù)器和MongoDB實(shí)例網(wǎng)絡(luò)是連通的。 # 如果密碼中包含特殊字符,請(qǐng)進(jìn)行轉(zhuǎn)義處理。 REPLICASET_URL = 'mongodb://root:****@dds-2ze043****.mongodb.rds.aliyuncs.com:3717,dds-2ze043****.mongodb.rds.aliyuncs.com:3717/admin?replicaSet=mgset-63****' testDb = 'test' testColl = 'testColl' # 獲取mongoclient。 client = MongoClient(REPLICASET_URL) # 插入一條記錄。 doc = dict(DEMO="Python for demo", MESG="Hello ApsaraDB For MongoDB") doc_id = client.testDb.testColl.insert_one(doc).inserted_id print ('doc_id:', doc_id) # 查詢記錄。 for d in client.testDb.testColl.find(dict(DEMO="Python for demo")): print ('find documents:', d) client.close()
運(yùn)行
python3.9 Main.py
。
C#連接示例
C#驅(qū)動(dòng)相關(guān)信息,請(qǐng)參見MongoDB C# Driver。
本示例測(cè)試的環(huán)境為IDE(Visual Studio)。
在Visual Studio中使用NuGet包管理工具(路徑: )下載如下包。
MongoDB.Driver
獲取云數(shù)據(jù)庫MongoDB副本集實(shí)例連接信息,如何獲取,請(qǐng)參見副本集實(shí)例連接說明。
C#示例代碼。
using MongoDB.Bson; using MongoDB.Driver; using System; using System.Collections.Generic; namespace Aliyun { class Program { static void Main(string[] args) { // 建議使用副本集高可用地址,確保高可用。 // 確保執(zhí)行腳本的機(jī)器和實(shí)例網(wǎng)絡(luò)是通常的。 // 如密碼包含特殊字符,則需要轉(zhuǎn)義。 const string replicaSetUrl = "mongodb://root:****@dds-2ze043****.mongodb.rds.aliyuncs.com:3717,dds-2ze043****.mongodb.rds.aliyuncs.com:3717/admin?replicaSet=mgset-63****"; const string testDb = "test"; const string testColl = "testColl"; try { // 建立連接獲取client。 MongoClient client = new MongoClient(replicaSetUrl); // 獲取集合。 var database = client.GetDatabase(testDb); var collection = database.GetCollection<BsonDocument>(testColl); // 插入一條記錄。 var document = new BsonDocument { { "name", "Csharp for Mongodb" }, { "desc", "Hello ApsaraDB For MongoDB" } }; collection.InsertOne(document); Console.WriteLine("Insert done\n"); // 查詢記錄。 var cursor = collection.Find(new BsonDocument{ { "name", "Csharp for Mongodb" } }).ToCursor(); foreach (var doc in cursor.ToEnumerable()) { Console.WriteLine(doc); } } catch (Exception e) { Console.WriteLine("連接異常:" + e.Message); } } } }
在IDE工具中單擊運(yùn)行。
Go連接示例
Go驅(qū)動(dòng)相關(guān)信息,請(qǐng)參見MongoDB Go Driver。
執(zhí)行如下命令,安裝驅(qū)動(dòng)包。
go get go.mongodb.org/mongo-driver
獲取云數(shù)據(jù)庫MongoDB副本集實(shí)例連接信息,如何獲取,請(qǐng)參見副本集實(shí)例連接說明。
將如下示例代碼保存為main.go。
package main import ( "context" "fmt" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" "log" ) func main() { // 建議使用副本集高可用地址,確保高可用。 // 確保執(zhí)行代碼的服務(wù)器和MongoDB實(shí)例網(wǎng)絡(luò)是連通的。 // 如果密碼中包含特殊字符,請(qǐng)進(jìn)行轉(zhuǎn)義處理。 replicaSetUrl := "mongodb://root:****@dds-2ze043****.mongodb.rds.aliyuncs.com:3717,dds-2ze043****.mongodb.rds.aliyuncs.com:3717/admin?replicaSet=mgset-63****" testDb := "test" testColl := "testColl" clientOpts := options.Client().ApplyURI(replicaSetUrl) // 連接Server,獲取client。 client, err := mongo.Connect(context.TODO(), clientOpts) if err != nil { fmt.Println("connect failed!") log.Fatal(err) return } fmt.Println("connect successful!") // 結(jié)束時(shí)斷開連接。 defer func() { if err = client.Disconnect(context.TODO()); err != nil { fmt.Println("disconnect failed!") log.Fatal(err) } fmt.Println("disconnect successful!") }() // 向Server發(fā)送Ping命令,驗(yàn)證連接成功。 if err = client.Ping(context.TODO(), nil); err != nil { fmt.Println("ping failed!") log.Fatal(err) return } fmt.Println("ping successful!") // 插入一條記錄。 collection := client.Database(testDb).Collection(testColl) res, err := collection.InsertOne(context.Background(), bson.M{"hello": "world"}) if err != nil { fmt.Println("insert result failed!") log.Fatal(err) return } id := res.InsertedID fmt.Println("Id: ", id) fmt.Printf("insert result: %v\n", res) // 查詢記錄。 result := bson.M{} filter := bson.D{{"_id", res.InsertedID}} if err := collection.FindOne(context.Background(), filter).Decode(&result); err != nil { fmt.Println("find failed!") log.Fatal(err) return } fmt.Printf("result: %v\n", result) }
運(yùn)行
go run main.go
。
常見問題
通過程序代碼連接實(shí)例時(shí)報(bào)錯(cuò),您可以從以下兩個(gè)方面排查:
網(wǎng)絡(luò)互通。您可以通過MongoShell連接實(shí)例,測(cè)試網(wǎng)絡(luò)連通性。具體操作,請(qǐng)參見通過Mongo Shell連接MongoDB副本集實(shí)例。
代碼問題。在確認(rèn)網(wǎng)絡(luò)通暢后,請(qǐng)檢查代碼以及運(yùn)行環(huán)境配置是否存在問題。