MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Partitionieren Sie Daten während der Aggregation um eine Übereinstimmungsabfrage herum

Diese Aggregation ergibt das gewünschte Ergebnis.

db.posts.aggregate( [
{ $match:  { updatedAt: { $gte: 1549786260000 } } },
{ $facet: {
        FALSE: [
            { $match: { toggle: false } },
            { $unwind : "$interests" },
            { $group : { _id : { iid: "$interests", pid: "$publisher" }, count: { $sum : 1 } } },
        ],
        TRUE: [
            { $match: { toggle: true, status: "INACTIVE" } },
            { $unwind : "$interests" },
            { $group : { _id : { iid: "$interests", pid: "$publisher" }, count: { $sum : -1 } } },
        ]
} },
{ $project: { result: { $concatArrays: [ "$FALSE", "$TRUE" ] } } },
{ $unwind: "$result" },
{ $replaceRoot: { newRoot: "$result" } },
{ $group : { _id : "$_id", count: { $sum : "$count" } } },
{ $project:{ _id: 0, iid: "$_id.iid", pid: "$_id.pid", count: 1 } }
] )


[ BEARBEITEN HINZUFÜGEN ]

Die Ausgabe der Abfrage unter Verwendung der Eingabedaten aus dem Fragepost:

{ "count" : 1, "iid" : "INT123", "pid" : "P789" }
{ "count" : 1, "iid" : "INT123", "pid" : "P123" }
{ "count" : 0, "iid" : "INT789", "pid" : "P789" }
{ "count" : 1, "iid" : "INT456", "pid" : "P789" }


[ BEARBEITEN HINZUFÜGEN 2 ]

Diese Abfrage liefert das gleiche Ergebnis mit unterschiedlichem Ansatz (Code):

db.posts.aggregate( [
  { 
      $match:  { updatedAt: { $gte: 1549786260000 } } 
  },
  { 
      $unwind : "$interests" 
  },
  { 
      $group : { 
          _id : { 
              iid: "$interests", 
              pid: "$publisher" 
          }, 
          count: { 
              $sum: {
                  $switch: {
                      branches: [
                        { case: { $eq: [ "$toggle", false ] },
                           then: 1 },
                        { case: { $and: [ { $eq: [ "$toggle", true] },  { $eq: [ "$status", "INACTIVE" ] } ] },
                           then: -1 }
                      ]
                  }          
              } 
          }
      } 
  },
  { 
      $project:{
           _id: 0, 
           iid: "$_id.iid", 
           pid: "$_id.pid", 
           count: 1 
      } 
  }
] )


[ BEARBEITEN HINZUFÜGEN 3 ]

HINWEIS:

Die Facettenabfrage führt die beiden Facetten (TRUE und FALSE) für denselben Dokumentensatz aus; es ist wie zwei Abfragen, die parallel laufen. Es gibt jedoch eine gewisse Duplizierung des Codes sowie zusätzliche Phasen, um die Dokumente entlang der Pipeline zu formen, um die gewünschte Ausgabe zu erhalten.

Die zweite Abfrage vermeidet die Codeduplizierung, und es gibt viel weniger Stufen in der Aggregationspipeline. Dies macht einen Unterschied, wenn der Eingabedatensatz eine große Anzahl von zu verarbeitenden Dokumenten enthält - in Bezug auf die Leistung. Im Allgemeinen bedeuten weniger Stufen weniger Iterationen der Dokumente (da eine Stufe die Dokumente scannen muss, die von der vorherigen Stufe ausgegeben werden).