如何将对一个doc所做的更改传播到mongodb中的其他相关文档

时间:2017-11-03 10:46:02

标签: javascript mongodb meteor observers

我有一个流星应用程序,其中有一个观察者可以帮助检测对某个特定文档的任何更改。如何在不必编写多个通用查询的情况下将对该文档所做的更改传播到其他相关文档?

我有什么:

orgPolicy:

{
    "_id" : "uudY4ekaZ4tPpN7KN",
    "organizationName" : "combat wombat systems 2",
    "priorityIP" : "2.2.2.2,6.6.6.6/24",
    "blacklistedServers" : "3.3.3.3",
    "policyType" : "orgLevelPolicy",

}

DeptLevelPolicy:

{
    "_id" : "Fb75pKgvePxakKTi4",
    "organizationName" : "combat wombat systems 2",
    "departmentName" : "mighty moose",
     "useOrgPolicyValuesForPriorityIp" : true,
    "priorityIP" : "2.2.2.2,6.6.6.6/24",
    "useOrgPolicyValuesBlacklistedServers" : true,
    "blacklistedServers" : "3.3.3.3",
    "policyType" : "departmentLevelPolicy",
}

我需要做什么

如果orgLevelPolicy文档发生更改,则只更新那些将字段的相应布尔标志设置为deptLevelPolicy

true个文档

例如

如果orgLevelPolicy.priorityIP发生变化,则只更新deptLevelPolicy.priorityIP deptLevelPolicy设置为useOrgPolicyValuesBlacklistedServers

true字段

我有一个如下所示的粗略观察者,但是对orgPolicy的任何更改都会对所有 deptLevelPolicy进行大量更改,而不管他们的bool标志是否已设置,或者该字段是否已设置甚至改变了。

(我希望我的解释没有任何意义。如果我需要进行任何更改以更好地说明方案,请告诉我)

 Meteor.startup(() => {

     var cursor = policies.find({
         policyType: "orgLevelPolicy"
     });

     var handle = cursor.observe({
         changed: function(orgLevelPolicyChanged) {
             console.log("Updating: departmentLevelPolicy: priorityIP");
             policies.update({policyType:"departmentLevelPolicy","useOrgPolicyValuesForPriorityIp": true},{$set:{priorityIP: orgLevelPolicyChanged.priorityIP, organizationName: orgLevelPolicyChanged.organizationName}},{multi:true});
             console.log("Updating: departmentLevelPolicy: blacklistedServers");
         },

     });
 });

1 个答案:

答案 0 :(得分:1)

您应该非常接近,但是您尝试匹配修改器中的父组织而不是您的查询。

第一个参数中的名称匹配到.update()查询)而不是第二个(修饰符

const handle = cursor.observe({
  changed(orgLevelPolicyChanged) {  
    policies.update(
      {
        policyType: "departmentLevelPolicy",
        useOrgPolicyValuesForPriorityIp: true,
        organizationName: orgLevelPolicyChanged.organizationName
      },
      { $set:
        {
          priorityIP: orgLevelPolicyChanged.priorityIP,
        }
      },
      { multi:true }
    );
  },
 });