Как распространять изменения, внесенные в один документ, на другие связанные документы в mongodb

Вопрос:

У меня есть приложение meteor, в котором есть наблюдатель, чтобы помочь обнаружить любые изменения в одном конкретном документе. Как распространять изменения, выполненные для этого документа, на другие связанные документы без необходимости писать несколько общих запросов?

Что у меня есть:

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 которые имеют поле, соответствующее логическому 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");
},

});
});

Лучший ответ:

Вы должны быть довольно близки, но вы пытаетесь сопоставить родительскую организацию в своем модификаторе вместо своего запроса.

Сопоставьте имя, совпадающее в первом аргументе с .update() (запрос), а не вторым (модификатором)

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

Оцените статью
TechArks.Ru
Добавить комментарий