MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Data partisi di sekitar kueri kecocokan selama agregasi

Agregasi ini memberikan hasil yang diinginkan.

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 TAMBAH ]

Output dari query menggunakan data input dari post pertanyaan:

{ "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 TAMBAHKAN 2 ]

Kueri ini mendapatkan hasil yang sama dengan pendekatan (kode) yang berbeda:

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 TAMBAH 3 ]

CATATAN:

Kueri faset menjalankan dua faset (TRUE dan FALSE) pada kumpulan dokumen yang sama; itu seperti dua kueri yang berjalan secara paralel. Tapi, ada beberapa duplikasi kode serta tahapan tambahan untuk membentuk dokumen di jalur pipa untuk mendapatkan hasil yang diinginkan.

Kueri kedua menghindari duplikasi kode, dan ada tahapan yang jauh lebih rendah dalam alur agregasi. Ini akan membuat perbedaan ketika dataset input memiliki banyak dokumen untuk diproses - dalam hal kinerja. Secara umum, tahapan yang lebih rendah berarti iterasi dokumen yang lebih sedikit (sebagai tahapan harus memindai dokumen yang merupakan keluaran dari tahap sebelumnya).




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Kueri agregasi Mongodb untuk mengurangi dan mengelompokkan nilai kumulatif

  2. Bagaimana cara menggunakan sql seperti di PyMongo?

  3. Driver C# MongoDB - Bagaimana cara menggunakan UpdateDefinitionBuilder?

  4. Driver MongoDB c# - Bisakah bidang yang disebut Id bukan Id?

  5. Tidak dapat membuat namespace dalam transaksi multi-dokumen (MongoDB 4.0, Spring Data 2.1.0, Spring Boot)