Sekarang pertanyaannya adalah bagaimana mendapatkan array userid di operator $in yang diekstrak dengan kueri sehingga seluruh kueri dapat dibuat dengan satu permintaan
"Kueri bersarang" seperti ini tidak berfungsi
db.user.find[{_id:{$in:db.usergroup.find[{_id:"g1"},{_id:0,Users:1}]}}].forEach[printjson];
Memberikan kesalahan ini
Sel 27 Mar 06. 17. 41 pengecualian yang tidak tertangkap. kesalahan. { "$err". "kueri tidak valid", "kode". 12580 }
gagal untuk memuat. mongoNestedSelect. js
1] apakah ini mungkin di mongodb dan bagaimana caranya?
2] bagaimana melakukan ini dengan driver c# resmi?
Solusi terbaik
Jawaban atas pertanyaan semacam itu di MongoDB sering kali adalah mendenormalisasi data Anda. Jika Anda hanya memerlukan daftar pengguna dalam grup, Anda dapat menyimpan ID pengguna dan Nama pengguna dalam dokumen grup. Dalam beberapa hal Anda menyusun database Anda sesuai dengan hasil yang ingin Anda lihat di layar daripada mencoba memasukkannya ke dalam format yang dinormalisasi
Jelas itu hanya akan berfungsi jika daftar grup pengguna Anda [dengan nama] dapat ditampung dalam satu dokumen, tetapi pendekatan Anda saat ini juga memiliki beberapa batasan terkait ukuran maksimum grup
Pendekatan lain adalah dengan menyimpan grup yang dimiliki pengguna dalam larik pada setiap dokumen 'Pengguna'. Tambahkan indeks pada bidang larik itu dan sekarang Anda dapat menemukan pengguna berdasarkan grup. Mengingat bahwa pengguna cenderung menjadi anggota grup yang lebih sedikit daripada jumlah anggota dalam grup, ini mungkin pendekatan terbaik di sini
db.user.save[{_id:"u1", name:"u1 name", groups:[{_id:"g1", name:"Group One"}, ...]}];
_Sekali lagi Anda dapat menyimpan nama grup dengan _id-nya sehingga Anda dapat segera menampilkan daftar grup yang dimiliki pengguna dengan sekali jalan pulang pergi. Tentu saja, jika Anda mengizinkan perubahan nama grup, Anda harus memulai tugas latar belakang untuk memperbaiki semua salinan nama ini
Saya juga akan menggunakan generator id MongoDB bawaan daripada milik Anda, ia memiliki banyak properti yang diinginkan
Solusi Terkait
Mongodb – Cara melakukan SQL Join yang setara di MongoDB
Pada Mongo 3. 2 jawaban atas pertanyaan ini sebagian besar tidak lagi benar. Operator $lookup baru yang ditambahkan ke pipa agregasi pada dasarnya identik dengan gabungan luar kiri
Dari dokumen
{
$lookup:
{
from: ,
localField: ,
foreignField: ,
as:
}
}
Tentu saja Mongo bukan basis data relasional, dan pengembang berhati-hati untuk merekomendasikan kasus penggunaan khusus untuk $lookup, tetapi setidaknya pada 3. 2 bergabung sekarang dimungkinkan dengan MongoDB
Sql – Cara menanyakan MongoDB dengan "suka"
Itu pasti
db.users.find[{"name": /.*m.*/}]
Atau, serupa
db.users.find[{"name": /m/}]
_Anda sedang mencari sesuatu yang berisi "m" di suatu tempat [Operator '%
' SQL setara dengan ekspresi reguler' '.*
'], bukan sesuatu yang memiliki "m" berlabuh ke awal string
Catatan. MongoDB menggunakan ekspresi reguler yang lebih kuat daripada "SEPERTI" di SQL. Dengan ekspresi reguler, Anda dapat membuat pola apa pun yang Anda bayangkan
MongoDB adalah database NoSQL berorientasi dokumen sumber terbuka. Kami telah memperkenalkan cara menggunakan mongosh
untuk menjalankan perintah CRUD dasar di konsol. Selain itu, kami juga telah memperkenalkan cara menggunakan MongoDB Atlas untuk menghosting server dan data MongoDB Anda. Dalam posting ini, kita akan melangkah lebih jauh dan mempelajari kueri MongoDB lanjutan untuk dokumen bersarang menggunakan operator $elemMatch
dari contoh praktis. Kami masih akan menggunakan mongosh
_ untuk menjalankan kueri di konsol sehingga Anda tidak perlu memasang apa pun tambahan. Namun, Anda dapat menggunakan IDE grafis untuk MongoDB jika Anda lebih suka bekerja di lingkungan visual
Gambar dari Pixabay
Sebelum kita memulai perjalanan lanjutan ini, kita harus memiliki server MongoDB. Anda dapat menggunakan Docker untuk memulai server MongoDB dalam wadah, atau menggunakan MongoDB Atlas untuk memulai server yang dihosting dan dikelola oleh Atlas. Untuk kesederhanaan, kami akan menggunakan wadah Docker di posting ini, tetapi Anda bebas memilih yang Anda sukai. Perintah untuk memulai wadah Docker untuk MongoDB adalah
$ docker network create mongo-net$ docker run --detach --network mongo-net --name mongo-server \
--env MONGO_INITDB_ROOT_USERNAME=admin \
--env MONGO_INITDB_ROOT_PASSWORD=pass \
--env MONGO_INITDB_ROOT_DATABASE=admin \
--volume mongo-data:/data/db \
--publish 27017:27017 \
mongo:5.0.6
Anda dapat mongosh
di komputer Anda, atau menggunakan yang disertakan dengan wadah Docker
$ docker exec -it mongo-server bash
$ mongosh "mongodb://admin:pass@localhost:27017"
_Sekarang kita dapat mulai bekerja dengan database MongoDB menggunakan mongosh
. Jika ini adalah pertama kalinya Anda bekerja mongosh
, disarankan Anda memeriksa posting pengantar ini terlebih dahulu agar Anda tidak tersesat dalam pertanyaan lanjutan
Data yang akan kita gunakan dalam postingan ini adalah beberapa data produk untuk toko online laptop, seperti yang ditunjukkan pada postingan Elasticsearch. Anda dapat mengunduh file JSON ini untuk mendapatkan data mentah yang akan digunakan
Jika Anda menggunakan mongosh
_ di dalam wadah Docker seperti saya, Anda perlu menyalin file JSON ke dalam wadah
$ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
Dan jika Anda menggunakan
$ docker exec -it mongo-server bash
$ mongosh "mongodb://admin:pass@localhost:27017"
_0 yang diinstal di komputer Anda, Anda harus memiliki file JSON ini di direktori kerja Anda saat ini. Kemudian kita dapat memuat file ini dan memasukkan semua dokumen ke dalam koleksiPoin kunci untuk kode di atas
- Kami menggunakan
$ docker exec -it mongo-server bash
_1 untuk mendeklarasikan database MongoDB yang disebut
$ mongosh "mongodb://admin:pass@localhost:27017"$ docker exec -it mongo-server bash
2, yang akan dibuat saat dokumen dimasukkan ke dalam koleksi di dalamnya
$ mongosh "mongodb://admin:pass@localhost:27017" - Data JSON dimuat oleh perintah
$ docker exec -it mongo-server bash
3. Dan data yang dimuat dalam format yang dapat digunakan oleh metode
$ mongosh "mongodb://admin:pass@localhost:27017"$ docker exec -it mongo-server bash
4 secara langsung. Data laptop dimasukkan ke dalam koleksi yang disebut
$ mongosh "mongodb://admin:pass@localhost:27017"$ docker exec -it mongo-server bash
5
$ mongosh "mongodb://admin:pass@localhost:27017" $ docker exec -it mongo-server bash
6 digunakan untuk memeriksa jumlah dokumen dalam koleksi dan metode
$ mongosh "mongodb://admin:pass@localhost:27017"$ docker exec -it mongo-server bash
7 digunakan untuk menunjukkan dokumen pertama dalam koleksi
$ mongosh "mongodb://admin:pass@localhost:27017"
Sekarang datanya sudah siap, kita bisa mulai menulis beberapa query untuk itu
Seperti yang kita lihat, dokumen laptop dalam koleksi
$ docker exec -it mongo-server bash
$ mongosh "mongodb://admin:pass@localhost:27017"
5 memiliki bidang $ docker exec -it mongo-server bash
$ mongosh "mongodb://admin:pass@localhost:27017"
9 yang merupakan larik dokumen tersemat. Lebih kompleks untuk membuat kueri dan memperbarui bidang seperti ini daripada bidang sederhana yang tidak bersarangPertama, mari cari semua laptop yang CPU-nya
$ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
0. Ini seharusnya cukup sederhana karena CPU tidak ambiguPerhatikan bahwa bidang bersarang ditanyakan dengan notasi titik dan harus diberi tanda kutip. Jika Anda lebih suka menulis kueri yang mencakup banyak baris dengan IDE grafis, silakan lihat posting ini mengenai IDE untuk MongoDB
Kita harus mendapatkan hasil yang kita inginkan karena hanya ada satu dokumen bersarang di array
$ docker exec -it mongo-server bash
$ mongosh "mongodb://admin:pass@localhost:27017"
9 yang memiliki nilai untuk model CPUSekarang mari kita cari semua laptop yang memiliki memori 16GB. Secara intuitif, Anda mungkin ingin menggunakan kueri seperti ini
Saat kueri di atas dijalankan, sepertinya semua laptop yang memorinya 16GB dikembalikan
Namun, di sinilah banyak pemula MongoDB membuat kesalahan dan di mana beberapa bug dimasukkan ke dalam kode Anda. Jika Anda memasukkan "itu" di mongosh
untuk menampilkan lebih banyak hasil atau cukup gulir ke bawah dekat bagian bawah halaman hasil dengan IDE dan periksa dengan cermat, Anda akan menemukan sesuatu yang aneh
Kami mendapatkan laptop yang penyimpanannya 16GB juga dengan kueri di atas. Ini karena kueri di atas menemukan dokumen di mana larik
$ docker exec -it mongo-server bash
$ mongosh "mongodb://admin:pass@localhost:27017"
9 memiliki setidaknya satu dokumen tersemat yang berisi bidang $ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
4 sama dengan $ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
5 dan setidaknya satu dokumen tersemat [tetapi tidak harus dokumen tersemat yang sama] yang berisi bidang $ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
6 sama dengan $ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
7Karena semua array
$ docker exec -it mongo-server bash
$ mongosh "mongodb://admin:pass@localhost:27017"
_9 memiliki dokumen tersemat yang $ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
4 adalah $ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
5, kueri di atas memberikan hasil yang salah. Apa yang kita inginkan adalah bahwa kedua syarat tersebut harus dipenuhi untuk dokumen tersemat yang sama. Untuk mencapai ini, kami tidak dapat meminta dengan notasi titik seperti yang ditunjukkan di atas tetapi perlu menggunakan operator $elemMatch
Kali ini laptop yang penyimpanannya 16GB tetapi memorinya bukan 16GB tidak akan dikembalikan. Jika tidak percaya, Anda bisa menghitung jumlah dokumen yang dikembalikan oleh kedua query tersebut
Sekarang mari kita coba kasus yang lebih rumit dan temukan semua laptop yang memorinya 16GB dan penyimpanannya 1TB. Kita perlu menggunakan operator mongosh
_2 untuk menentukan kondisi untuk dua dokumen bersarang, yang sangat mirip dengan penggunaan kata kunci mongosh
3 dan mongosh
4 di Elasticsearch untuk kueri dokumen bersarang
Permintaan ini akan mengembalikan hasil yang kita inginkan
Perhatikan bahwa meskipun operator mongosh
_2 adalah operator default di MongoDB, itu wajib di sini karena kami menanyakan bidang yang sama dalam dua kondisi berbeda. Jika tidak, kami hanya akan menanyakan kondisi kedua dan akan mendapatkan hasil yang salah
Anda akan mendapatkan satu hasil yang salah dalam kasus ini. Jika Anda mencoba dengan kondisi lain, Anda akan mendapatkan hasil yang lebih salah
Setelah Anda mengetahui cara membuat kueri array dengan dokumen bersarang, seharusnya cukup mudah untuk memperbaruinya. Perhatikan bahwa dokumen bersarang diurutkan dalam larik dan karena itu Anda dapat mengakses dokumen bersarang berdasarkan posisi indeks
Mari perbarui memori menjadi 16GB untuk laptop dengan mongosh
6 sama dengan 1
Jika kami memeriksa laptop ini sekarang, atributnya seharusnya sudah diperbarui
Di sini kami menggunakan proyeksi untuk hanya menampilkan bidang
$ docker exec -it mongo-server bash
$ mongosh "mongodb://admin:pass@localhost:27017"
_9 dari dokumenBersulang. Dokumen bersarang berhasil diperbarui
Dalam posting ini, kami telah memperkenalkan cara membuat kueri dan memperbarui array dokumen bersarang di MongoDB. Ini adalah penggunaan tingkat lanjut tetapi sangat umum dalam praktiknya. Saya yakin Anda cukup percaya diri dalam menangani masalah semacam ini dalam pekerjaan Anda sekarang