1. BASICDBObject
Seluruh permintaan agregasi adalah untuk menghitung jumlah pengguna di berbagai negara bagian sebagai skenario:
1. Kriteria filter:
Tanggal adalah tanggal kueri:
Query basicdbObject = basicdbobject () baru; Query.put ("waktu", new BasicDbObject ("$ gte", tanggal + "00:00:00") .Perampingkan ("$ LTE", Tanggal + "23:59:59")));Jika ada beberapa kondisi: tambahkan query.put ("status", 0);
Jika ada atau filter:
Nilai BASICDBLIST = BASICDBLIST baru (); values.add (new BasicDBObject ("Status", new BasicDBObject ("$ exists", false)))); values.add (new BasicDbObject ("status", 0)); query.put ("$ atau", nilai);Where New BasicDBObject ("$ Exists", false)) berarti bahwa "status" tidak ada (dokumen MongoDB tidak dapat sama dengan bidang entitas)
2. Pertandingan Splicing
DbObject mooth = new BasicDbObject ("$ match", kueri);Masukkan kueri sebelumnya ke dalam filter macth
3. Kondisi penyambungan dan pengelompokan
Langkah ini setara dengan SQL Group oleh
BASICDBObject groupBy = new BASICDBObject (); // Grouping Condition GroupBy.put ("UserId", "$ UserId"); // Group Menurut ID Pengguna IDSeperti langkah penyaringan pada langkah pertama, jika ada beberapa grup, Anda dapat langsung menambahkannya ke yang berikut: groupby.put ("status", "$ status");
4. Kueri pasca-kelompok
Sambungan pertama pengelompokan:
DbObject select = new BasicDbObject ("_ id", groupby);Jika kami ingin beroperasi pada data yang dikelompokkan: (Berikut adalah statistik pengguna)
SELECT.PUT ("Count", New BasicDBObject ("$ Sum", 1));5. Group Splice $
Dbobject group = new BasicDbObject ("$ group", pilih);Sejauh ini. Mari kita sambungkan pernyataan MongoDB berakhir di sini
Mari kita mulai operasi kueri:
Impor com.mongodb.aggregationoutput; impor org.springframework.data.mongodb.core.mongotemplate; output agregationoutput = mongotemplate.getCollection ("Berikut adalah nama tabel data mongOdB") .agregate (cocok, grup);Baca hasil kueri:
Iterable <dbObject> map = output.Results (); // TransiP MapFor (dbObject dbObject: peta) {// Peta yang dibaca di sini adalah {"_id": {"userid": 1, "status" 0}} ... peta <string, objek> resultMap = (peta, objek>) DBOB. //Transfer.0 integer userid = integer.parseint (commutil.tostring (ausgmap.get ("userid")). Ganti (". 0", "")); // Di sini kita dapat beroperasi pada data kita; Integer count = integer.parseint (commutil.tostring (dbobject.get ("count")))); }2. DBObject
Tanpa basa-basi lagi, jika Anda berpikir metode pertama adalah jangka panjang, maka saya akan membawakan Anda permintaan agregasi yang lebih ringkas dengan kode yang lebih ringkas:
Cukup unggah kode.
1. Perhatikan paket yang diimpor:
impor com.mongodb.dbObject; impor com.mongodb.util.json;
2. $ macth:
(Tanggal Awal Beginday-Query; Tanggal Akhir Akhir-Hari)
DBObject mooth = (dbObject) json.parse ("{$ match: {'status': '1', 'time': {$ gte: '"+beginday+", $ lte:'"+endday+"'}}}");3. $ Group:
(Dikelompokkan berdasarkan userid, hitung jumlah pengguna, mengumpulkan nilai bidang amout, dan ambil nilai maksimum bidang Amout)
DbObject group = (dbObject) json.parse ("{$ group: {_ id: '$ userid', count: {$ sum: 1}, total: {$ sum: '$ jumlah'}, maxsigle: {$ max: '$ jumlah'}}}");Setelah kondisinya disambung, mulailah meminta:
Daftar <DBObject> Daftar = ArrayList baru <DBObject> (); list.add (match); list.add (grup); output agregationOutput = mongoTemplate.getCollection ("nama tabel"). Agregat (daftar);Tidak perlu membicarakan hasil traversal. Di atas telah dijelaskan secara rinci
Apakah metode kedua jauh lebih sederhana dari yang lain? Tapi itu menguji keakraban seseorang dengan pernyataan MongoDB.
【Diperpanjang】
Kemudian metode di atas meluas
// Status adalah 0 atau 1; ketik bukan 11; Waktu dbObject match = (dbObject) json.parse ("{$ match: {'status': {$ in: ['0', '1']}, ketik: {$ ne: 11}, 'waktu': {$ gte: '+beginday+", $ lte:'+endday+"'{$ gte:'+beginday+", $ lte: '+endday+"'}}}}}}}}: terakhir kali dbobject group = (dbObject) json.parse ("{$ group: {_ id: '$ userid', count: {$ sum: 1}, terakhir: {$ max: '$ time'}}}"); // pada hasil yang dihitung pada langkah sebelumnya, data dengan penyaringan waktu lebih besar dari 100 kali dbob dbobal = DBOB DBOB = DBOB DBOB (DBOB DBOB (DATE DATERICE (DATE DATA DAT (DATA DAT DAT DAT (DATA DAT DAT DAT (DATA DAT (DATA DAT (DATA DAT (DATA DAT DATA (DATA DAT (DATA DAT (DATA DAT DATA (DATA DATA DATA (DATA DAT. Json.parse ("{$ match: {count: {$ gte: 100}}}"); // $ proyek ---- bidang apa yang harus ditampilkan dalam hasil kueri, dan layar diatur ke 1. Field _id (bidang) tidak perlu ditampilkan sebagai berikut, jadi Anda perlu menentukannya sebagai berikut: // DB. Name Collection.aggregate ([{$ project: {_id: 0, count: 1, lastSuccTime: 1}}]) dbObject Project = (dbObject) json.parse ("{$ project: {_ id: 1, count: 1, terakhir) Json.parse ("{$ sortir: {'count':-1}}"); // daftar penyortiran <dbObject> list = new ArrayList <dbObject> (); list.add (match); list.add (grup); list.add (grupkMatch); list.add (proyek); list.add (sort); list.add (grupmatch); list.add (proyek); list.add (sort); sortir mongotemplate.getCollection ("nama tabel") .agregate (daftar); // hasil kueri3. Pernyataan BasicDBObject+Script
BASICDBObject groupIndex = new BASICDBObject (); BASICDBObject DifisteQuery = new BasicDbObject (); DistanceQuery.put ("UserId", BASICDBObject baru ("$ in", UserIds) (); // nada UserIds ("count (" count ("new -nurnject (" noverDBObject () () (initIndex. Data dari database.prev mewakili hasil kueri // prev.count Hitungan di sini adalah jumlah langkah sebelumnya initIndex) string redupred = "function (doc, prev) {if (doc.status == 0) {prev.count+= 1;};}"; Daftar <string, object >> Object >> Object, map <MAP, MAP <string, Object> getCollection ("Collection"). Group (GroupIndex, Difistical, InitIndex, Reduce, Null);Akhirnya, Anda bisa mendapatkan hasilnya dengan mengulangi daftar. [PS: Ada batasan pada metode agregasi grup ini ---> akan ada kesalahan jika melebihi 20.000 data]
Di atas adalah apa yang saya gunakan pemrosesan agregasi MongoDB dalam pemrosesan bisnis biasa. Jika ada metode yang lebih baik atau sesuatu yang membutuhkan perbaikan, silakan tinggalkan saya pesan ~