1

假設我有一臺本地服務器正在運行,並且我也有一臺已經在亞馬遜上運行的服務器。Postgres和Mongodb的雙向數據庫同步

兩臺服務器都可以將CRUD數據發送到它的數據庫。

Note that the servers use both `postgres` and `mongodb`. 

現在,當沒有人使用WiFi(通常在夜間),我想同步兩個postgresmongodb數據庫,以便從每個數據庫的本地所有寫入服務器上的每個數據庫獲取正確應用。

我不希望使用多主因爲:

  1. 的MongoDB不支持這種架構本身,所以也許我需要一個複雜的選擇。
  2. 我想控制何時以及如何同步兩個數據庫。
  3. 我不想在其他人使用互聯網時使用網絡帶寬。

所以任何人都可以讓我看到正確的方向。

此外,如果您列出了一些解決我的問題的工具,它將非常有幫助。 謝謝。

+0

我們的[MongoDB驅動程序](http://www.cdata.com/drivers/mongodb/)中的任何一個都可以讓您構建自己的應用程序,以將新的/更新的文檔從基於雲的數據庫推送到本地數據庫。我會得到一個正確的答案,並很快發佈。 –

回答

1

我們有幾個驅動程序可以幫助您完成此過程。我假定了一些軟件開發的知識,並將展示我們的MongoDB的ADO.NET Provider,它使用了熟悉的MongoDBConnection,MongoDBCommandMongoDBDataReader對象。

首先,你要創建的連接字符串與您連接雲MongoDB實例:

string connString = "Auth Database=test;Database=test;Password=test;Port=27117;Server=http://clouddbaddress;User=test;Flatten Objects=false"; 

你會注意到,我們有拼合對象屬性設置爲false,這確保了任何JSON /文檔中包含的BSON對象將作爲原始JSON/BSON返回。

創建連接字符串後,您可以建立連接並從數據庫中讀取數據。您需要以某種方式存儲返回的數據,以便您可以輕鬆訪問以供將來使用。

List<string> columns = new List<string>(); 
List<object> values; 
List<List<object>> rows = new List<List<object>>(); 
using (MongoDBConnection conn = new MongoDBConnection(connString)) 
{ 


    //create a WHERE clause that will limit the results to newly added documents 
    MongoDBCommand cmd = new MongoDBCommand("SELECT * FROM SomeTable WHERE ...", conn); 
    rdr = cmd.ExecuteReader(); 
    results = 0; 

    while (rdr.Read()) 
    { 
    values = new List<object>(); 
    for (int i = 0; i < rdr.FieldCount; i++) 
    { 
     if (results == 0) 
     columns.Add(rdr.GetName(i)); 
     values.Add(rdr.GetValue(i)); 
    } 
    rows.Add(values); 
    results++; 
    } 
} 

您收集了所有的每個要複製的對象的數據後,可以配置到本地MongoDB實例的新連接,並建立查詢,插入新的文件。

connString = "Auth Database=testSync;Database=testSync;Password=testSync;Port=27117;Server=localhost;User=testSync;Flatten Objects=false"; 
using (MongoDBConnection conn = new MongoDBConnection(connString)) { 
    foreach (var row in rows) { 
    //code here to create comma-separated strings for the columns 
    // and values to be inserted in a SQL statement 

    String sqlInsert = "INSERT INTO backup_table (" + column_names + ") VALUES (" + column_values + ")"; 
    MongoDBCommand cmd = new MongoDBCommand(sqlInsert, conn); 
    cmd.ExecuteQuery(); 
} 

此時,您將插入所有新文檔。然後,您可以根據更新的日期/時間更改過濾器(開頭的WHERE子句),並使用UPDATE命令更新其在本地MongoDB實例中的相應條目。

事情看出來:

  • 確保你正確地篩選出新的/更新的條目。
  • 確保您正確解釋變量的類型,以便在SQL查詢中輸入值時正確包圍引號(或不包含引號)。

我們有幾個可能對您有用的驅動程序。我上面演示了ADO.NET Provider,但我們也有driver for writing apps in XamarinJDBC driver (for Java)