仅复制MongoDB中{'public':true}的文档

时间:2012-07-07 01:33:03

标签: mongodb

我有以下网络/ mongodb设置:

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

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

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

其他详情:

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

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

  

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

     

John发送电子邮件给Sarah,并要求她阅读文件D1(   一个被公开的)。莎拉去了http://example.com并且是   能够阅读D1,但永远不会看到D2

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

我欢迎任何建议。

谢谢!

1 个答案:

答案 0 :(得分:2)

MongoDB(截至2.0.6)不支持过滤复制。

但是......你可能有可能实现自己的方案来更新基于tailable cursor MongoDB oplog的记录。本地oplog.rs上限集合与用于将更改中继到副本集成员的机制相同,并包括插入,删除和更新的详细信息。

有关此技术的示例,请参阅此博文:Creating Triggers for MongoDB

在您的情况下,操作将类似于:

  • 如果使用public:true
  • 插入或更新记录,则将记录从集合A复制到B.
  • 如果在集合A中使用public:false
  • 删除或更新记录,则从集合B中删除记录