sql >> Database teknologi >  >> NoSQL >> MongoDB

Opdel data omkring en matchforespørgsel under aggregering

Denne sammenlægning giver det ønskede resultat.

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


[ EDIT TILFØJ ]

Outputtet fra forespørgslen ved hjælp af inputdata fra spørgsmålsindlægget:

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


[EDIT TILFØJ 2]

Denne forespørgsel får det samme resultat med en anden tilgang (kode):

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


[ EDIT TILFØJ 3 ]

BEMÆRK:

Facetforespørgslen kører de to facetter (SAND og FALSK) på det samme sæt dokumenter; det er som to forespørgsler, der kører parallelt. Men der er en vis duplikering af kode såvel som yderligere trin til at forme dokumenterne ned ad pipelinen for at få det ønskede output.

Den anden forespørgsel undgår kodeduplikering, og der er meget mindre stadier i aggregeringspipelinen. Dette vil gøre en forskel, når inputdatasættet har et stort antal dokumenter, der skal behandles - med hensyn til ydeevne. Generelt betyder mindre trin mindre gentagelser af dokumenterne (da et trin skal scanne de dokumenter, der er output fra det foregående trin).




  1. hvordan man godkender mongoose-forbindelse mongodb i node.js

  2. Fejlmeddelelse fra MongoDB Operation `disneys.insertOne()` buffering timeout efter 10000ms

  3. MongoDB - Logisk ELLER når du søger efter ord og sætninger ved hjælp af fuldtekstsøgning

  4. Hvordan sorterer man underdokumenter i array-feltet?