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)