Javascript 如何将对一个文档所做的更改传播到mongodb中的其他相关文档
我有一个meteor应用程序,其中有一个观测者来帮助检测某个特定文档的任何更改。如何将对该文档所做的更改传播到其他相关文档,而不必编写多个通用查询 我所拥有的: 组织政策:Javascript 如何将对一个文档所做的更改传播到mongodb中的其他相关文档,javascript,mongodb,meteor,observers,Javascript,Mongodb,Meteor,Observers,我有一个meteor应用程序,其中有一个观测者来帮助检测某个特定文档的任何更改。如何将对该文档所做的更改传播到其他相关文档,而不必编写多个通用查询 我所拥有的: 组织政策: { "_id" : "uudY4ekaZ4tPpN7KN", "organizationName" : "combat wombat systems 2", "priorityIP" : "2.2.2.2,6.6.6.6/24", "blacklistedServers" : "3.3.3.3
{
"_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",
}
我需要做什么
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");
},
});
});
如果orgLevelPolicy
文档发生更改,则仅更新那些字段的相应布尔标志设置为true
例如
如果orgLevelPolicy.priorityIP
发生更改,则仅更新那些deptLevelPolicy
的deptLevelPolicy.priorityIP
字段,其UseOrgPolicyValuesBlackListedServer
设置为true
我有一个粗略的观察者,如下所示,但是对orgPolicy的任何更改都会触发对alldeptLevelPolicy的大量更改,而不管它们的布尔标志是否设置,或者字段是否已经更改
(我希望我的解释有意义。如果我需要做任何更改以更好地说明场景,请告诉我)
您应该非常接近,但您正在尝试匹配修饰符中的父组织,而不是查询 将第一个参数中的名称匹配到
.update()
(查询)而不是第二个(修饰符)
谢谢你,米歇尔。让我试试这个。哦,是的,当我删除非必要代码时,我错过了
policyType
。我把它加回去了。至于parentPolicyId
,我的部门名称在所有文档中都是唯一的。所以我猜这会持续下去。
const handle = cursor.observe({
changed(orgLevelPolicyChanged) {
policies.update(
{
policyType: "departmentLevelPolicy",
useOrgPolicyValuesForPriorityIp: true,
organizationName: orgLevelPolicyChanged.organizationName
},
{ $set:
{
priorityIP: orgLevelPolicyChanged.priorityIP,
}
},
{ multi:true }
);
},
});