更新处理重复项和增加运算符的查询
背景:
alerts
集合的更新查询。 blacklistedCommunication
的对象数组。 应该发生什么:
当新流程到达时, alerts
文档仅在流程的client_addr
和server_addr
尚未blacklistedCommuication
。 与此同时,如果我们发现重复,它应该只增加flowCount
。
当前查询:
如果以下更新查询不存在,则将新对象推送到blacklistedCommunication
对象。 但是,如果它确实存在,它将不会更新flowCount
我怎样才能将这个逻辑合并到查询中? 在重复的情况下,我是否需要编写单独的更新查询?
alerts.update({
alertLevel: "orgLevelAlert",
alertCategory: "blacklistedServersViolationAlert",
alertState: "open",
'blacklistedCommunication.client': {
$ne: flow.netflow.client_addr
},
// 'blacklistedCommunication.server': {
// $ne: flow.netflow.server_addr
// }
}, {
$set: {
"misc.updatedTime": new Date()
},
$inc: {
flowCount: 1
},
$push: {
blacklistedCommunication: {
client: flow.netflow.client_addr,
server: flow.netflow.server_addr
}
}
});
您可以使用$ addToSet而不是$push
。 它将确保blacklistedCommunication
内的唯一{client:*,server:*}
对象,并将始终更新flowCount
:
alerts.update({
alertLevel: "orgLevelAlert",
alertCategory: "blacklistedServersViolationAlert",
alertState: "open"
}, {
$set: {
"misc.updatedTime": new Date()
},
$inc: {
flowCount: 1
},
$addToSet: {
blacklistedCommunication: {
client: flow.netflow.client_addr,
server: flow.netflow.server_addr
}
}
});
链接地址: http://www.djcxy.com/p/61959.html
上一篇: Update query that handles duplicates and increment operator
下一篇: Are MongoDB bulk updates atomic if they apply to the same document?