更新处理重复项和增加运算符的查询

背景:

  • 每次收到“流量”时,我都会收集一个名为alerts集合的更新查询。
  • 我的警报文档中有一个名为blacklistedCommunication的对象数组。
  • 应该发生什么:

    当新流程到达时, alerts文档在流程的client_addrserver_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?