我有一个流星应用程序,其中有一个观察者可以帮助检测对某个特定文档的任何更改。如何在不必编写多个通用查询的情况下将对该文档所做的更改传播到其他相关文档?
我有什么:
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");
},
});
});
答案 0 :(得分:1)
您应该非常接近,但是您尝试匹配修改器中的父组织而不是您的查询。
第一个参数中的名称匹配到.update()
(查询)而不是第二个(修饰符)
const handle = cursor.observe({
changed(orgLevelPolicyChanged) {
policies.update(
{
policyType: "departmentLevelPolicy",
useOrgPolicyValuesForPriorityIp: true,
organizationName: orgLevelPolicyChanged.organizationName
},
{ $set:
{
priorityIP: orgLevelPolicyChanged.priorityIP,
}
},
{ multi:true }
);
},
});