Dua koleksi mongodb dalam satu permintaan

Saya memiliki banyak koleksi klien dan banyak koleksi data klien, koleksinya dipisahkan dan saya tidak ingin menggabungkannya menjadi satu koleksi (karena servlet lain sudah berfungsi) tetapi sekarang saya perlu "Bergabung" data dari kedua koleksi dalam satu hasil.

Karena Kueri harus mengembalikan hasil dalam jumlah besar, saya tidak ingin menanyakan server sekali dan kemudian menggunakan hasilnya untuk menanyakan lagi. Saya juga prihatin tentang lalu lintas antara server dan DB dan memori yang akan ditempati oleh kumpulan hasil di RAM server.

Cara kerjanya sekarang adalah saya mendapatkan daftar klien yang relevan dari koleksi 'klien' dan mengirimkan daftar ini ke kueri kumpulan 'data klien' dan baru kemudian saya mendapatkan hasil agregat.

Saya ingin memotong penerimaan dan pengiriman daftar klien dari dan segera kembali ke server, membuat server bertanya pada dirinya sendiri, membiarkan permintaan pengumpulan data klien meminta pengumpulan klien untuk daftar klien yang relevan.

Bagaimana saya bisa menggunakan prosedur tersimpan (fungsi javascript) untuk melakukan kueri di DB dan hanya mengembalikan klien yang relevan dari koleksi. Atau, Apakah ada cara untuk menulis kueri yang menggabungkan hasil dari koleksi lain?


person Toda Raba    schedule 15.02.2015    source sumber
comment
tidak ada opsi seperti itu untuk menanyakan banyak koleksi di monogb. Satu hal adalah menggunakan ReferenceField atau ForienKey   -  person itzMEonTV    schedule 15.02.2015


Jawaban (4)


"Kabar baik semuanya", kueri agregasi ini berfungsi dengan baik di mongo Shell sebagai kueri gabungan

db.clientData.aggregate([{
    $match: {
        id: {
            $in: db.clients.distinct("_id",
            {
                "tag": "qa"
            })
        }
    }
},
    $group: {
        _id: "$computerId",
        total_usage: {
            $sum: "$workingTime"
        }
    }
}]);
person Toda Raba    schedule 23.02.2015

Ide utama dalam pemodelan data MongoDB adalah menjadi berat-tulis, bukan berat-baca: simpan data dalam format yang Anda butuhkan untuk membaca, bukan dalam format yang meminimalkan/menghindari redundansi (yaitu menggunakan model data yang didenormalisasi).

Saya tidak ingin menggabungkannya menjadi satu koleksi

Itu bukan argumen yang bagus

Saya juga prihatin tentang lalu lintas antara server dan DB [...]

Jika Anda membutuhkan datanya, Anda memerlukan datanya. Bagaimana cara menanyakannya membuat perbedaan di sini?

[...] dan memori yang akan ditempati oleh kumpulan hasil di RAM server.

Apakah jumlah data begitu besar sehingga Anda ingin streaming dari server ke klien, sehingga ditransfer dalam potongan? Berapa banyak data yang kita bicarakan, dan mengapa klien membaca semuanya?

Bagaimana saya bisa menggunakan prosedur tersimpan untuk melakukan kueri di DB dan hanya mengembalikan klien yang relevan dari koleksi

Tidak ada prosedur tersimpan di MongoDB, tetapi Anda dapat menggunakan peta sisi server/reduce untuk 'bergabung' koleksi. Umumnya, kode yang disimpan dan dijalankan oleh database merupakan pelanggaran terhadap pemisahan arsitektur lapisan. Saya menganggapnya sebagai salah satu peretasan paling jelek sepanjang masa - tapi itu masih bisa diperdebatkan.

Selain itu, yang tidak terlalu bisa diperdebatkan, perlu diingat bahwa M/R memiliki overhead yang sangat besar di MongoDB dan tidak diarahkan untuk kueri real-time yang dibuat, misalnya. dalam panggilan server web. Panggilan ini akan memakan waktu ratusan milidetik.

Apakah ada cara untuk menulis kueri yang menggabungkan hasil dari koleksi lain?

Tidak, operasi dibatasi pada satu koleksi. Anda dapat melakukan kueri kedua dan menggunakan operator $in di sana, yang mirip dengan subpilihan dan cukup cepat, tetapi tentu saja memerlukan dua kali perjalanan bolak-balik.

person mnemosyn    schedule 15.02.2015
comment
Terima kasih banyak atas jawaban baik Anda. Saya tidak ingin menggabungkannya ke satu koleksi karena servlet lainnya sudah berfungsi. Cara kerjanya sekarang adalah saya mendapatkan daftar klien yang relevan dari koleksi klien dan mengirimkan daftar ini ke kueri pengumpulan data klien dan baru kemudian saya mendapatkan hasil agregat. Ya, saya memerlukan datanya, tetapi saya ingin memotong penerimaan dan pengiriman daftar klien dari dan segera kembali ke server, membuat server bertanya sendiri, biarkan permintaan pengumpulan data klien meminta pengumpulan klien untuk klien yang relevan daftar. - person Toda Raba; 17.02.2015
comment
Yang saya maksud dengan prosedur adalah fungsi javascript - person Toda Raba; 17.02.2015

Bagaimana saya bisa menggunakan prosedur tersimpan untuk melakukan kueri di DB dan hanya mengembalikan klien yang relevan dari koleksi. kalau tidak

Tidak ada prosedur di Mongodb

Atau, Apakah ada cara untuk menulis kueri yang menggabungkan hasil dari koleksi lain?

Anda biasanya tidak perlu melakukan Gabung apa pun di MongoDB dan tidak ada hal seperti itu. Fleksibilitas dokumen sudah menangani kebutuhan gabungan yang khas. Anda harus memikirkan model dokumen Anda dan menanyakan cara mendesain gabungan dari skema Anda harus selalu menjadi tujuan pertama Anda. Sebagai alternatif, Anda mungkin perlu menggunakan aggregationatau Map-Reduce di sisi server untuk menangani ini.

person styvane    schedule 15.02.2015
comment
Tidak ada prosedur tersimpan seperti SQL tetapi ada cara untuk menyimpan fungsi javascript yang menyerupai prosedur, saya yakin OP ingin mengetahui hal ini. docs.mongodb.org/manual/tutorial/ - person mshthn; 15.02.2015
comment
@LaszloTenki Anda benar dan seperti yang saya katakan dalam jawaban saya, dia dapat menggunakan Pengurangan Peta di sisi server. - person styvane; 15.02.2015

Pertama-tama, mnemosyn dan Michael9 benar. Tetapi jika saya berada di posisi Anda, juga dengan asumsi bahwa pengumpulan data klien adalah satu dokumen per klien, saya akan menyimpan ID dokumen dari dokumen data klien di dokumen klien untuk membuat "gabung" (masih belum ada gabungan di Mongo) lebih mudah .

Jika Anda memiliki lebih banyak dokumen data klien per klien, maka serangkaian ID dokumen.

Tetapi semua ini tidak menyelamatkan Anda dari keharusan menerapkan "gabung" dalam kode aplikasi Anda, jika itu adalah aplikasi Rails maka mungkin di pengontrol Anda.

person mshthn    schedule 15.02.2015