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

Apakah mungkin untuk mengelompokkan dan menjumlahkan beberapa kolom dengan kerangka kerja agregasi MongoDB?

Sejak MongoDB 3.4 ini dapat dicapai sedikit lebih sederhana menggunakan beberapa pipa agregasi dengan $facet .

diambil dari dokumen :

Jadi, untuk kasus penggunaan Anda, ini akan dicapai dengan hal berikut:

const aggregatorOpts = [
    { $match: { character: 'broquaint' } }, // Match the character
    {
        // Seperate into 2 or more pipes that will count class and
        // race seperatly
        $facet: {
            race: [
                // Group by race and get the count:
                // [
                //   {
                //     _id: 'Halfling',
                //     count: 3
                //   }
                //   {
                //     _id: 'Naga',
                //     count: 2
                //   }
                // ]

                // $sortByCount is the same as
                // { $group: { _id: <expression>, count: { $sum: 1 } } },
                // { $sort: { count: -1 } }

                { $sortByCount: '$race' },

                // Now we want to transform the array in to 1 document,
                // where the '_id' field is the key, and the 'count' is the value.
                // To achieve this we will use $arrayToObject. According the the
                // docs, we have to first rename the fields to 'k' for the key,
                // and 'v' for the value. We use $project for this:
                {
                    $project: {
                        _id: 0,
                        k: '$_id',
                        v: '$count',
                    },
                },
            ],
            // Same as above but for class instead
            class: [
                { $sortByCount: '$class' },
                {
                    $project: {
                        _id: 0,
                        k: '$_id',
                        v: '$count',
                    },
                },
            ],
        },
    },
    {
        // Now apply the $arrayToObject for both class and race.
        $addFields: {
            // Will override the existing class and race arrays
            // with their respective object representation instead.
            class: { $arrayToObject: '$class' },
            race: { $arrayToObject: '$race' },
        },
    },
];

db.races.aggregate(aggregatorOpts)

Yang menghasilkan sebagai berikut:

[
  {
    "race": {
      "Halfling": 3,
      "Naga": 2
    },
    "class": {
      "Hunter": 3,
      "Rogue": 1,
      "Fighter": 1,
    }
  }
]

Jika Anda puas dengan format output yang disediakan @Asya, maka Anda dapat menghapus $project dan $addFields tahapan, dan tinggalkan $sortByCount bagian di setiap sub-pipa.

Dengan fitur-fitur baru ini, agregasi jauh lebih mudah diperluas dengan jumlah tambahan, Cukup tambahkan saluran agregasi lain di $facet .Bahkan sedikit lebih mudah untuk menghitung subkelompok, tetapi itu akan menjadi pertanyaan terpisah.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana hideIndex() Bekerja di MongoDB

  2. MongoDB - paging

  3. Bagaimana cara menggabungkan beberapa bidang dalam koleksi?

  4. MongoDB $toString

  5. Bagaimana cara mengelompokkan dan memilih dokumen yang sesuai dengan maks dalam setiap grup di MongoDB?