sql >> Database >  >> NoSQL >> MongoDB

Partitioneer gegevens rond een matchquery tijdens aggregatie

Deze aggregatie geeft het gewenste resultaat.

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


[ BEWERK TOEVOEGEN ]

De uitvoer van de query met behulp van de invoergegevens van de vraagpost:

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


[ BEWERK TOEVOEGEN 2 ]

Deze zoekopdracht krijgt hetzelfde resultaat met een andere benadering (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 
      } 
  }
] )


[ BEWERK ADD 3 ]

OPMERKING:

De facetquery voert de twee facetten (TRUE en FALSE) uit op dezelfde set documenten; het is als twee query's die parallel lopen. Maar er is enige duplicatie van code en extra fasen voor het vormgeven van de documenten in de pijplijn om de gewenste uitvoer te krijgen.

De tweede query vermijdt de codeduplicatie en er zijn veel minder fasen in de aggregatiepijplijn. Dit zal verschil maken wanneer de invoerdataset een groot aantal documenten moet verwerken - in termen van prestaties. In het algemeen betekent kleinere fasen minder herhalingen van de documenten (omdat een fase de documenten moet scannen die uit de vorige fase worden uitgevoerd).




  1. Hoe Pandas-dataframes in Redis te zetten/krijgen met pyarrow

  2. Hoe $ setDifference in twee arrays te controleren met behulp van mongo-query

  3. MongoDB:ik wil het array-object in de verzameling opslaan

  4. technieken voor het opslaan van bibliotheken in mongoDB's system.js