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

MongoDB - Kerangka Agregasi (Jumlah Total)

Ada solusi menggunakan Push dan slice:https://stackoverflow.com/a/39784851/4752635 (@emaniacs menyebutkannya di sini juga).

Tapi saya lebih suka menggunakan 2 pertanyaan. Solusi dengan mendorong $$ROOT dan menggunakan $slice menyebabkan keterbatasan memori dokumen sebesar 16MB untuk koleksi besar. Juga, untuk koleksi besar, dua kueri bersama-sama tampaknya berjalan lebih cepat daripada yang mendorong $$ROOT. Anda juga dapat menjalankannya secara paralel, jadi Anda hanya dibatasi oleh dua kueri yang lebih lambat (mungkin yang mengurutkan).

  1. Pertama untuk memfilter dan kemudian mengelompokkan berdasarkan ID untuk mendapatkan jumlah elemen yang difilter. Jangan memfilter di sini, itu tidak perlu.
  2. Kueri kedua yang memfilter, mengurutkan, dan memberi nomor halaman.

Saya telah menyelesaikan solusi ini menggunakan 2 kueri dan kerangka kerja agregasi (catatan - saya menggunakan node.js dalam contoh ini):

var aggregation = [
  {
    // If you can match fields at the begining, match as many as early as possible.
    $match: {...}
  },
  {
    // Projection.
    $project: {...}
  },
  {
    // Some things you can match only after projection or grouping, so do it now.
    $match: {...}
  }
];


// Copy filtering elements from the pipeline - this is the same for both counting number of fileter elements and for pagination queries.
var aggregationPaginated = aggregation.slice(0);

// Count filtered elements.
aggregation.push(
  {
    $group: {
      _id: null,
      count: { $sum: 1 }
    }
  }
);

// Sort in pagination query.
aggregationPaginated.push(
  {
    $sort: sorting
  }
);

// Paginate.
aggregationPaginated.push(
  {
    $limit: skip + length
  },
  {
    $skip: skip
  }
);

// I use mongoose.

// Get total count.
model.count(function(errCount, totalCount) {
  // Count filtered.
  model.aggregate(aggregation)
  .allowDiskUse(true)
  .exec(
  function(errFind, documents) {
    if (errFind) {
      // Errors.
      res.status(503);
      return res.json({
        'success': false,
        'response': 'err_counting'
      });
    }
    else {
      // Number of filtered elements.
      var numFiltered = documents[0].count;

      // Filter, sort and pagiante.
      model.request.aggregate(aggregationPaginated)
      .allowDiskUse(true)
      .exec(
        function(errFindP, documentsP) {
          if (errFindP) {
            // Errors.
            res.status(503);
            return res.json({
              'success': false,
              'response': 'err_pagination'
            });
          }
          else {
            return res.json({
              'success': true,
              'recordsTotal': totalCount,
              'recordsFiltered': numFiltered,
              'response': documentsP
            });
          }
      });
    }
  });
});


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB:bagaimana cara menghitung jumlah kunci dalam dokumen?

  2. Bagaimana cara menanyakan MongoDB langsung dari Ruby alih-alih menggunakan Mongoid?

  3. Instal MongoDB di Windows

  4. Meminta Objek di Sub Array Mongoose

  5. Unggah file ke DEFAULT_FILE_STORAGE alih-alih GridF dengan mongoengine