2017-11-22 2 views
0

Hintergrund Duplikaten und Inkrementoperator Griffe:Aktualisierungsabfrage, die

  1. Ich habe eine Update-Abfrage auf Sammlung alerts, die jede Zeit läuft so genannte „Flow“ empfangen wird.
  2. Ich habe ein Array von Objekten in meinem Alert-Dokument blacklistedCommunication.

Was passieren soll:

Wenn ein neuer Fluss kommt, dann wird der alerts doc aktualisiert nur, wenn die Strömung des client_addr und server_addr sind nicht bereits in blacklistedCommuication. Wenn wir gleichzeitig Duplikate finden, sollte es nur die flowCount inkrementieren.

Die aktuelle Abfrage:

Die folgende Update-Abfrage funktioniert neue Objekte zu blacklistedCommunication Objekt schieben, wenn es nicht bereits präsentieren. Wenn es jedoch tatsächlich vorhanden ist, wird es nicht aktualisiert flowCount

Wie kann ich diese Logik in die Abfrage integrieren? Muss ich im Falle von Duplikaten eine separate Update-Anfrage schreiben?

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 
      } 
     } 
    }); 

Antwort

1

können Sie $addToSet anstelle von $push. Es wird einzigartig {client:*,server:*} Objekt innerhalb blacklistedCommunication gewährleisten und wird immer aktualisiert 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 
     } 
    } 
}); 
+0

Dank. Ich habe mich nur gefragt. Dieses Update wird extrem häufig ausgeführt, sogar einige Male pro Sekunde. Wäre es in Ordnung, so viele Updates auf Mongo zu feuern? Oder sollte ich stattdessen die Eindeutigkeitsprüfung in js handhaben müssen? – blueren

+0

Hmm, ich muss die ursprüngliche Frage falsch lesen, aber soweit ich das verstehe muss man flowCount in jedem Fall updaten. Könnten Sie das bitte bestätigen, da die Folgefrage in diesem Szenario keinen Sinn ergibt? –

+0

Mein schlechtes. Was die Frage betrifft, funktioniert Ihre Antwort perfekt. Ignoriere meine Folgefrage. – blueren