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

Analog untuk grup concat di sql

Sesuai komentar sejauh ini tidak jelas apa yang Anda kelompokkan atau apa yang Anda inginkan sebagai hasil akhirnya, selain untuk mengatakan bahwa Anda ingin membuat tanggal Anda digabungkan menjadi sesuatu seperti "hanya hari" tanpa jam atau menit bersama. Mungkin Anda menginginkan hari-hari yang berbeda itu untuk tujuan tertentu.

Ada berbagai Operator Tanggal dalam pipa yang dapat Anda gunakan pada tanggal, dan ini adalah $concat operatornya juga. Sayangnya semua Operator Tanggal menghasilkan bilangan bulat sebagai hasilnya, dan untuk jenis string Tanggal yang Anda inginkan, $concat hanya akan bekerja dengan string. Masalah lainnya adalah Anda tidak dapat melempar integer menjadi tipe string dalam agregasi.

Tapi Anda bisa gunakan sub-dokumen, di sini kita hanya akan bekerja dengan tanggal:

db.record.aggregate([
    // Unwind the array to work with it
    {$unwind: "$date"},

    // project into our new 'day' document
    {$project:{ 
        day: { 
            year: {$year: "$date"},
            month: {$month: "$date"}, 
            day: {$dayOfMonth: "$date"}
        }
     } },

     // optionalally sort if date order is important [ oldest -> newest ] 
     {$sort: { "day.year": -1, "day.month": -1, "day.day": -1}},

     // Wind back unique values into the array
     {$group: {_id:"$_id", days: {$addToSet: "$day"} }}
])

Jadi, ini bukan string, tetapi dapat dengan mudah diproses setelahnya menjadi satu, tetapi yang terpenting adalah dikelompokkan dan dapat diurutkan.

Prinsipnya tetap sama jika Anda menginginkan dates yang unik dengan cara ini sebagai array di akhir atau apakah Anda ingin mengelompokkan total berdasarkan tanggal tersebut. Jadi terutama, ingatlah bagian $unwind dan $project menggunakan operator tanggal.

--EDIT--

Dengan ucapan terima kasih kepada komunitas seperti yang ditunjukkan dalam postingan ini ada ini tidak berdokumen perilaku $substr , di mana bilangan bulat dapat dilemparkan sebagai string.

db.record.aggregate([
    // Unwind the array to work with it
    {$unwind: "$date"},

    // project into our new 'day' document
    {$project:{ 
        day: { 
            year: {$year: "$date"},
            month: {$month: "$date"}, 
            day: {$dayOfMonth: "$date"}
        }
     } },

     // optionalally sort if date order is important [ oldest -> newest ] 
     {$sort: { "day.year": -1, "day.month": -1, "day.day": -1}},

     // now we are going to project to a string ** magic @heinob **
     {$project: { 
         day: {$concat: [
             {$substr: [ "$day.year", 0, 4 ]},
             "-",
             {$substr: [ "$day.month", 0, 2 ]},
             "-",
             {$substr: [ "$day.day", 0, 2 ]}
         ]}
     }},

     // Wind back unique values into the array
     {$group: {_id:"$_id", days: {$addToSet: "$day"} }}
])

Dan sekarang days adalah string. Seperti yang saya sebutkan sebelumnya, jika pemesanan penting bagi Anda maka pendekatan terbaik adalah memproyeksikan ke dalam jenis dokumen seperti yang telah dilakukan dan mengurutkan pada tombol numerik. Tentu saja $project yang mengubah tanggal dapat dimasukkan ke tahap $group untuk singkatnya, yang mungkin ingin Anda lakukan saat bekerja dengan seluruh dokumen.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. mongo:pengembalian tidak sama dengan hitungan ()

  2. MongoDB menghapus dokumen subdokumen dari subdokumen

  3. Bagaimana cara mengindeks beberapa bidang data unik dalam satu dokumen di Mongoose?

  4. Mengapa server konfigurasi MongoDB harus satu atau tiga saja?

  5. Cocokkan setidaknya N elemen array dengan daftar kondisi