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

Hitung bidang Sub dokumen yang Berbeda dan Output sebagai Tombol Bernama

Kasus dasar di sini adalah menggunakan .aggregate() dengan $unwind karena Anda memerlukan akses ke nilai dalam array sebagai kunci pengelompokan Anda dan tentu saja $group karena begitulah cara Anda "mengelompokkan" sesuatu:

db.collection.aggregate([
  { "$match": { "auctionId": 22 } },
  { "$unwind": "$itmLst" },
  { "$group": {
    "_id": "$itmLst.category",
    "count": { "$sum": 1 }
  }}
])

Ini akan memberi Anda output seperti:

{ "_id": "ANTIQUES", "count": 56 }
{ "_id": "TOOLS", "count": 89 }
{ "_id": "JEWLRY", "count":  45 }

Sekarang Anda benar-benar harus belajar untuk hidup dengan itu, karena "daftar" dalam format kursor default adalah hal yang baik yang secara alami dapat diubah. Juga kunci bernama IMHO tidak secara alami cocok untuk presentasi data dan Anda biasanya menginginkan properti umum dalam daftar yang dapat diubah.

Jika Anda benar-benar ingin menggunakan output kunci bernama tunggal, maka Anda akan memerlukan MongoDB 3.4.4 atau lebih tinggi untuk memiliki akses ke $arrayToObject yang memungkinkan Anda menggunakan nilai sebagai nama kunci, dan tentu saja $replaceRoot untuk menggunakan output ekspresi itu sebagai dokumen baru untuk menghasilkan:

db.collection.aggregate([
  { "$match": { "auctionId": 22 } },
  { "$unwind": "$itmLst" },
  { "$group": {
    "_id": "$itmLst.category",
    "count": { "$sum": 1 }
  }},
  { "$group": {
    "_id": null,
    "data": { "$push": { "k": "$_id", "v": "$count" } }
  }},
  { "$replaceRoot": {
    "newRoot": {
      "$arrayToObject": "$data"
    }
  }}
])

Atau jika Anda tidak memiliki opsi itu, maka Anda harus mengonversi keluaran kursor dalam kode:

db.collection.aggregate([
  { "$match": { "auctionId": 22 } },
  { "$unwind": "$itmLst" },
  { "$group": {
    "_id": "$itmLst.category",
    "count": { "$sum": 1 }
  }}
]).toArray().reduce((acc,curr) => 
  Object.assign(acc,{ [curr._id]: curr.count }),
  {}
)

Keduanya bergabung menjadi satu objek dengan kunci bernama dari output agregasi asli:

{
    "ANTIQUES": 56,
    "TOOLS": 89,
    "JEWLRY": 45,
    ...
}

Dan itu menunjukkan bahwa hasil keluaran asli benar-benar cukup, dan biasanya Anda ingin "pembentukan ulang akhir" semacam itu dilakukan dalam kode yang menggunakan keluaran kursor, jika Anda benar-benar membutuhkan pembentukan ulang itu sejak dasar data yang dibutuhkan tetap dikembalikan.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDb menghapus subdokumen dari dokumen

  2. MongoDB- Sisipkan jika tidak ada, jika tidak lewati

  3. Node.js SSH Tunneling ke MongoDB menggunakan Mongoose

  4. Menggunakan variabel dalam pernyataan pembaruan MongoDB

  5. Apakah saya perlu membersihkan input pengguna sebelum memasukkan MongoDB (kombo MongoDB + Node js)