4

我有以下网络/mongodb 设置:

  • 1 个主要的 mongodb 数据库(10.0.0.1无法从 Internet 访问)- 包含集合 A 和集合 B 中的私人信息,其中包含由受信任用户创建的文档。在任何时候,用户都可以将集合 B 中的任何文档标记为“公共”,这会将其属性从 更改{'public':false}{'public':true}

  • 1 个公共 mongodb 数据库(10.0.0.2运行一个可通过反向代理从 Internet 访问的网络服务器)- 不包含集合 A,但应包含集合 B 中标记为“公共”的所有文档。这台机器将向外部用户提供这些公共文档网络。

我将如何设置 mongodb,以便当主数据库 ( 10.0.0.1) 中的文档更新为 时{'public':true},它会被复制到公共 mongodb 数据库 ( 10.0.0.2)?

其他详情:

  • 我正在使用 PHP 驱动程序
  • 文档很小,最大 2KB
  • 这些服务器上的负载可能永远不会超过 10 个并发用户
  • 最终的一致性是可以的,最多几分钟,但我想知道我的选择是什么。

所以,重申一下,这里有一个用例:

John VPN 进入我们的专用网络,打开http://10.0.0.1/,创建一个文档(称之为D2),将其标记为私有。然后,约翰查看了一个较旧的文档,D1并决定通过单击“公开”按钮将其公开。服务器自动使文档在公共服务器上可用example.com(公共 IP x.y.z.w,内部 IP 10.0.0.2)。

约翰给莎拉发了一封电子邮件,要求她阅读文档 D1(公开的那个)。莎拉去http://example.com并且能够阅读D1,但从未见过D2

我的目标是实现这一点,而无需手动编写脚本来同步这两个数据库。我怀疑这应该是可能的,但我无法从我读过的关于 MongoDB 复制的内容中弄清楚。

我欢迎任何建议。

谢谢!

4

1 回答 1

2

MongoDB (as at 2.0.6) does not have support for filtered replication.

However ... it may be possible for you to implement your own scheme to update records based on a tailable cursor of MongoDB's oplog. The local oplog.rs capped collection is the same mechanism used to relay changes to members of a replica set and includes details for inserts, deletes, and updates.

For an example of this technique, see this blog post: Creating Triggers for MongoDB.

In your case the actions would be something like:

  • copy record from collection A to B if it is inserted or updated with public:true
  • remove record from collection B if it is deleted or updated in collection A with public:false
于 2012-07-09T05:02:24.430 回答